Dupliquer possible:
Que fait “#define STR (a) #a”?
Evaluation des macros en langage de programmation c
#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; }
Je m’attendais à ce que le résultat soit identique pour le printf. Mais ce que je reçois est différent (donné ci-dessous)
12 f(1,2)
quelqu’un peut-il expliquer quelle est la raison et pourquoi cela se passe-t-il en détail?
J’ai prolongé votre programme avec une ligne supplémentaire
printf("%d\n",f(1,2));
ce qui entraîne à son tour
printf("%d\n",12);
(appelé avec gcc -E
).
Vos deux lignes aboutissent à
printf("%s\n","12"); printf("%s\n","f(1,2)");
Que se passe t-il ici?
f(1,2)
est clair – 1
et 2
simplement collés ensemble.
g(something)
reproduit simplement something
comme une chaîne, sans la traiter spécialement -> "f(1,2)"
.
h(something)
, à son tour, laisse le résultat de g(something)
développer.
La norme C indique que les arguments de macro ne sont pas développés s’ils sont ssortingngifiés ou concaténés. C’est pourquoi g(YOUR_MACRO)
YOUR_MACRO n’est pas développé. Toutefois, dans le cas h(YOUR_MACRO)
, h – () () effectue la codification indirectement . Il est donc conforme aux règles de développement des arguments de macro C et est développé.
Premier:
printf("%s\n",h(f(1,2)));
devient:
g(12)
qui devient à son tour
"12"
Deuxième:
printf("%s\n",g(f(1,2)));
devient
"f(1,2)"
puisque #
convertit l’argument en paramètre de chaîne.