• STATISTIQUES
  • Il y a eu un total de 1 membres et 4978 visiteurs sur le site dans les dernières 24h pour un total de 4 979 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] hax.tor
    50 level de challenges mélangés
    Challenges
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges
    [EN] Bright Shadows
    JavaScript: 13, Exploit: 27, Crypto: 69, CrackIt: 52, Stegano: 67, Flash: 3, Programming: 16, Java-Applet: 10, Logic: 20...
    Challenges
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges
    [FR] apprendre-a-manipuler
    Site d'apprentissage de la manipulation d'autrui.
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] tricks avec les macros
19-08-2014, 11h24
Message : #1
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
[C] tricks avec les macros
Yop,

bon, aujourd'hui je viens de découvrir un truc sympathique en C, et particulièrement avec les macros, je ne m'y étais jamais vraiment attardé, mais c'est quand même vraiment puissant comme truc.

bref, trêves de bavardages, je vous laisse avec du code :

Code C :

#define STR_NX(A) #A
#define STR(A) STR_NX(A)

#define CCAT_NX(A, B) A ## B
#define CCAT(A, B) CCAT_NX(A, B)

#include <stdio.h>

int main (void) {
  puts(STR(foo));
  puts(STR(bar));
  puts(STR("hello world"));
  puts(STR(CCAT(foo, bar)));
  return 0;
}
 


Compilez, exécutez, admirez!!

Bon, du coup, peut être que quelques explications s'imposent!

Dans la première macro le #A permet d'étendre la macro, c'est a dire qu'on va récupérer son symbole, globalement, ça permet de la transformer en string!!

Ensuite, dans 3eme macro : #define CCAT_NX(A, B) A ## B, le symbole A ## B permet tout simplement de concatener deux macros non étendues

Les deux autre macros, permettront ensuite de pouvoir utiliser les autre macros en les enchainant, comme on peut le voir dans le puts(STR(CCAT(foo, bar)));
Si on ne les définit pas, cela peut nous permettre d'afficher directement le symbole d'une macro, en faisant par exemple:

Code C :

#define foo "bar"
#define STR_NX(A) #A

#include <stdio.h>

int main (void) {
  puts(STR_NX(foo));
  return 0;
}
 


Voila, voila, si vous connaissez d'autres tricks avec les macros, n'hésitez pas ! ;)
+1 (3) -1 (0) Répondre
19-08-2014, 11h48
Message : #2
b0fh Hors ligne
Membre actif
*



Messages : 210
Sujets : 17
Points: 309
Inscription : Jul 2012
RE: [C] tricks avec les macros
Hello,

Qu'y-a-il comme applications concrètes de cette technique ?

J'en connais deux. La première pour le debugging:

Code C :
#define ASSERT(T) ((T) || fprintf(stderr, "Warning: " #T " failed\n"))


Et la deuxième comme template du pauvre, par exemple des structures polymorphiques sur leurs types:

Code C :

#define DECLARE_LINKED_LIST_OF(t) struct { t item; struct list_of_##t *next } list_of_##t;
 
+1 (5) -1 (0) Répondre
22-08-2014, 13h13 (Modification du message : 22-08-2014, 14h42 par darcosion.)
Message : #3
darcosion Hors ligne
Newbie
*



Messages : 21
Sujets : 3
Points: 14
Inscription : Oct 2013
RE: [C] tricks avec les macros
J'ai remarqué une chose amusant même si je ne l'ai pas totalement saisie.

Lorsque l'on écrit
Code :
puts(STR(CCAT(l,olol)));
, il n'y a pas de soucis, on obtient un "lolol", mais lorsque l'on fait
Code :
puts(STR_NX(CCAT(l,olol)));
, là on obtient "CCAT(l, olol)".

J'aurais bien une expliquation : entre deux macro, il y a un temps d'interprétation qui permet de faire pour un STR : CCAT(STR_NX(l),STR_NX(olol)).

Chose qui n'est pas possible avec un STR_NX.
+1 (0) -1 (0) Répondre
22-08-2014, 14h33
Message : #4
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [C] tricks avec les macros
bah je dirais que : étape 1
STR(CCAT(l, olol)) --> STR_NX(CCAT_NX(l, olol))

étape 2:
#lolol --> "lolol"

Et dans le deuxieme cas:

étape 1:
STR_NX(CCAT(l, olol)) --> #CCAT_NX(l, olol)

étape 2:
#CCAT_NX(l, olol) --> "CCAT_NX(l, olol)"
+1 (0) -1 (0) Répondre
30-08-2014, 02h57
Message : #5
darcosion Hors ligne
Newbie
*



Messages : 21
Sujets : 3
Points: 14
Inscription : Oct 2013
RE: [C] tricks avec les macros
Hey, je reviens vers vous car j'ai trouvé une autre utilisation des macro via ce tuto.

Donc si on fait :
Code :
#define xstr(s) str(s)
#define str(s) #s
Puis
Code :
scanf("%"xstr(TAILLE)"s", tab);
Cela peut résoudre des problèmes de tails liés à la fonction scanf().
+1 (0) -1 (0) Répondre
30-08-2014, 08h52 (Modification du message : 30-08-2014, 08h53 par gruik.)
Message : #6
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C] tricks avec les macros
hmm.. il doit falloir rajouter un -1 quelque part (ou un +1 à l'allocation), sinon on a un off-by-one là justement

quand le tableau est fixe -mettons char[100]- on aura meilleur compte de mettre explicitement/en dur %99s dans le scanf

quand le tableau est dynamique, la stratégie à adopter peut varier,
- soit reposer sur le switch %m de *scanf() (GNU !) qui va allouer tout seul comme un grand ce dont on a besoin
- soit faire du traitement bufferisé avec des tampons de taille fixe
- soit brider carrément la taille des données saisies/couper tout ce qui dépasse
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (1) -1 (0) Répondre
21-09-2014, 14h22 (Modification du message : 21-09-2014, 15h43 par supersnail.)
Message : #7
darcosion Hors ligne
Newbie
*



Messages : 21
Sujets : 3
Points: 14
Inscription : Oct 2013
RE: [C] tricks avec les macros
Okay, c'est bon à savoir.

Sinon, en fouillant du coté de la lib windows.h, j'ai trouvé une autre macro nommé MAX_PATH qui permet d'allouer à une chaine de caractère la taille maximale d'un path (256 caractères).
+1 (0) -1 (0) Répondre
21-09-2014, 15h46 (Modification du message : 21-09-2014, 15h55 par supersnail.)
Message : #8
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,610
Sujets : 72
Points: 466
Inscription : Jan 2012
RE: [C] tricks avec les macros
Enfin là c'est juste un define qui rend "humainement lisible" une constante "magique", c'est pas un trick en soi Tongue

D'ailleurs, cette constante me semble un peu outdated, normalement le noyau NT peut gérer des paths de longueur arbitraires, sûrement une relique antique datant du moment où windows était basé sur MS-DOS et laissé comme ça pour des raisons obscures de rétro-compatibilité.

Edit: apparament cette constante est toujours d'actualité pour les applications Win32, il semblerait qu'il s'agisse là d'une limitation du sous-système Win32 et non du noyau NT (à noter qu'il est possible de faire sauter cette limitation en travaillant avec les API Unicode et en rajoutant le préfixe "\?\" devant le chemin mais bon...). Pour un peu plus de précisions, voir http://stackoverflow.com/questions/28257...n-max-path. Bref le sous-système win32 devrait être remplacé par un truc un peu plus moderne imo :]
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  [C TOTW 6] Xor tricks ark 7 450 06-03-2016, 23h36
Dernier message: Commodor
  [C TOTW 1] Trick avec #include ark 10 449 01-09-2014, 18h23
Dernier message: Commodor
  [NASM] Création d'un thread sous Linux uniquement avec les syscalls supersnail 2 218 04-03-2013, 23h36
Dernier message: Dobry

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut