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

El programa anterior imprime 100 en c concatenando var y 12. ¿Cómo funciona g ## g2?#define f (g, g2) g ## g2

+2

No es un programa, es una macro. Buscar "operador de token y pegar" en su libro de idioma C/C++ favorito. –

+2

@nobugz: ¿qué? Lo anterior * es * un programa, aunque no del todo legal C. Y el programa imprime 100. Hay una macro en el programa seguro, pero al decir, "el programa anterior imprime 100", Shishir no se refiere, correctamente, al todo el programa y no a la macro? –

Respuesta

8

## solo pega tokens juntos. Es una directiva de preprocesador.

E.g.

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

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

## es el "comando" preprocesador para concatenar lo que viene antes y después.

0

Así que después de preproceso que se verá así:

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

Ésta es pegar modo, se describe here para gcc. El preprocesador hace el pegado de los tokens, no el compilador.

0

La concatenación está siendo realizada por el preprocesador porque utilizó el comando ##.

Cuando no está seguro de lo que está haciendo el preprocesador, puede pedirle a gcc que se detenga una vez que haya ejecutado el preprocesador. Como esto es antes de que se ejecute el compilador, la salida es bastante fácil de entender.

Por ejemplo, suponga que tiene un archivo 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); 
} 

Puede producir la salida del preprocesador pasando la opción -E a 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"; 
} 

Tenga en cuenta que #include se tire en el contenido del archivo se especifica y puede hacer que la salida del preprocesador bastante largo.

+0

-1 (no realmente) para 'void main()'! – pmg