[C] tricks avec les macros
|
19-08-2014, 11h24
Message : #1
|
|
ark
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 :
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 :
Voila, voila, si vous connaissez d'autres tricks avec les macros, n'hésitez pas ! ;) |
|
19-08-2014, 11h48
Message : #2
|
|
b0fh
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 :
|
|
22-08-2014, 13h13
(Modification du message : 22-08-2014, 14h42 par darcosion.)
Message : #3
|
|
darcosion
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))); Code : puts(STR_NX(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. |
|
22-08-2014, 14h33
Message : #4
|
|
ark
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)" |
|
30-08-2014, 02h57
Message : #5
|
|
darcosion
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) Code : scanf("%"xstr(TAILLE)"s", tab); |
|
30-08-2014, 08h52
(Modification du message : 30-08-2014, 08h53 par gruik.)
Message : #6
|
|
gruik
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) |
|
21-09-2014, 14h22
(Modification du message : 21-09-2014, 15h43 par supersnail.)
Message : #7
|
|
darcosion
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). |
|
21-09-2014, 15h46
(Modification du message : 21-09-2014, 15h55 par supersnail.)
Message : #8
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,614 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
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 |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
[C TOTW 6] Xor tricks | ark | 7 | 2,372 |
06-03-2016, 23h36 Dernier message: Commodor |
|
[C TOTW 1] Trick avec #include | ark | 10 | 2,606 |
01-09-2014, 18h23 Dernier message: Commodor |
|
[NASM] Création d'un thread sous Linux uniquement avec les syscalls | supersnail | 2 | 1,239 |
04-03-2013, 23h36 Dernier message: Dobry |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)