# define f (g, g2) g ## g2

#define f(g,g2) g##g2 main() { int var12=100; printf("%d",f(var,12)); } 

El progtwig anterior imprime 100 en c al concatenar var y 12. ¿Cómo funciona g ## g2?

## simplemente pega las fichas juntas. Es una directiva de preprocesador.

P.ej

 #define PASTE(a,b) a##b int i=PASTE(1,2); /* int i=12; */ 

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

Esto es pegar token, descrito aquí para gcc. El preprocesador realiza el pegado de tokens, no el comstackdor.

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

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

El preprocesador está realizando la concatenación porque usó el comando ## .

Cuando no esté seguro de lo que está haciendo el preprocesador, puede pedir a gcc que se detenga después de ejecutar el preprocesador. Como esto es antes de que se ejecute el comstackdor, 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 "" # 1 "" # 1 "pre.c" void main() { int a = 123; int b = 1234567; char* c = "IGetQuoted"; } 

Tenga en cuenta que #include extraerá el contenido del archivo que especifica y puede hacer que la salida del preprocesador sea bastante larga.