2009-11-28 9 views
5
#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

Le programme ci-dessus imprime 100 en c en concaténant var et 12. Comment fonctionne g ## g2?#define f (g, g2) g ## g2

+2

Ce n'est pas un programme, c'est une macro. Rechercher "l'opérateur de jeton-collage" dans votre livre de langue C/C++ préféré. –

+2

@nobugz: quoi? Le * ci-dessus * est * un programme, mais pas tout à fait légal C. Et le programme imprime 100. Il y a une macro dans le programme, mais en disant, "le programme ci-dessus imprime 100", Shishir ne se réfère pas correctement au programme entier et pas à la macro? –

Répondre

8

## colle juste des jetons ensemble. C'est une directive de préprocesseur.

E.g.

#define PASTE(a,b) a##b 

int i=PASTE(1,2); /* int i=12; */ 
0

## est le préprocesseur « commande » pour concaténer ce qui vient avant et après.

0

Ainsi, après préprocesseur ressemblera à ceci:

main() 
{ 
int var12=100; 
printf("%d",var12); 
} 
0

Ceci est coller jeton, décrit here pour gcc. Le collage de jetons est effectué par le préprocesseur et non par le compilateur.

0

La concaténation est en cours d'exécution par le préprocesseur car vous avez utilisé la commande ##.

Lorsque vous ne savez pas exactement ce que fait le préprocesseur, vous pouvez demander à gcc de s'arrêter après l'exécution du préprocesseur. Puisque c'est avant que le compilateur ne fonctionne, la sortie est assez facile à comprendre.

Par exemple, supposons que vous avez un fichier pre.c

#define FOO 123 
#define CONCAT(x,y) x##y 
#define STRING(x) #x 

void main() 
{ 
    int a = FOO; 
    int b = CONCAT(123,4567); 
    char* c = STRING(IGetQuoted); 
} 

Vous pouvez produire la sortie de préprocesseur en passant l'option -E à gcc.

$ gcc -E pre.c 
# 1 "pre.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "pre.c" 




void main() 
{ 
    int a = 123; 
    int b = 1234567; 
    char* c = "IGetQuoted"; 
} 

Gardez à l'esprit que #include va tirer dans le contenu du fichier, il précise et peut rendre la sortie de préprocesseur assez longue.

+0

-1 (pas vraiment) pour 'void main()'! – pmg