2012-07-23 4 views
7

Je veux connaître la raison de la sortie de ce code. Je ne pouvais pas trouver une réponse.Préprocesseur C: macro de macro de chaînage et macro d'identité

#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).

+3

juste pour apprendre le travail du préprocesseur ... – Dhatri

+3

@cnicutar Je pense qu'il l'a trouvé ici: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

il n'a pas été écrit par moi .. il a été demandé dans un test. – Dhatri

Répondre

4
h(f(1,2)) 

f(1,2) est remplacé par a. a ne fait pas l'objet d'un opérateur # ou ## donc il est étendu à 12. Vous avez maintenant g(12) qui s'étend à "12".

g(f(1,2)) 

f(1,2) est remplacé par a. L'opérateur # appliqué à a empêche la macro-expansion, de sorte que le résultat est littéralement "f(1,2)".

+0

oh ... ok merci ... je ne me suis pas concentré sur le fonctionnement de # opérateur – Dhatri

+0

@vindhya C'est tout un gâchis sanglant. – Potatoswatter

2

Il suffit de faire les remplacements.

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

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

Vous devriez également voir here.

+0

pour le le second aussi g (f (1,2)) peut être g (12) et 12 droit? – Dhatri

Questions connexes