Préprocesseur C: ssortingngize macro et macro d’identité

Je veux savoir la raison derrière la sortie de ce code. Je ne pouvais pas venir avec une réponse.

#define f(a,b) a##b #define g(a) #a #define h(a) g(a) void main() { printf("%s %s",h(f(1,2)),g(f(1,2))); } 

PS: la sortie est 12 f(1,2) . Je pensais que c’était 12 12 ou f(1,2) f(1,2) .

 h(f(1,2)) 

f(1,2) est substitué à a . a n’est pas le sujet d’un opérateur # ou ## , il est donc étendu à 12 . Maintenant vous avez g(12) qui passe à "12" .

 g(f(1,2)) 

f(1,2) est substitué à a . L’opérateur # appliqué à a macro empêche l’expansion, donc le résultat est littéralement "f(1,2)" .

Il suffit de faire les remplacements.

 h(f(1, 2)) -> g(12) -> "12" g(f(1,2)) -> "f(1, 2)" 

Vous devriez aussi voir ici .