Pourquoi ne reçois-je pas le résultat attendu dans le programme c suivant?

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.