#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
#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
##
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; */
##
est le préprocesseur « commande » pour concaténer ce qui vient avant et après.
Ainsi, après préprocesseur ressemblera à ceci:
main()
{
int var12=100;
printf("%d",var12);
}
Ceci est coller jeton, décrit here pour gcc. Le collage de jetons est effectué par le préprocesseur et non par le compilateur.
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.
-1 (pas vraiment) pour 'void main()'! – pmg
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é. –
@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? –