¿Qué significa ‘a ## b’ en C?

Desde usbtiny / defs.h (AVR libc código USB para controladores ATTiny):

#define CAT2(a,b) CAT2EXP(a, b) #define CAT2EXP(a,b) a ## b #define CAT3(a,b,c) CAT3EXP(a, b, c) #define CAT3EXP(a,b,c) a ## b ## c 

¿Qué es el operador ##? He estado haciendo esto durante 30 años, y estoy perplejo. Y Google no está ayudando porque no creo que estén indexando esos caracteres.

El símbolo ## en una definición de macro representa la concatenación.

Asi que

 #define concat(a,b) a ## b 

significará que

 concat (pri, ntf) ("hello world\n"); 

post-procesos a

 printf("hello world\n"); 

Documentación aquí .

Similarmente útil es el operador de estrado ( # ), con el que no debe confundirse.

Una prueba:

 /* test with * gcc -E test.c * having removed the #include lines for easier to read output */ #include  #include  #define concat(a,b) a ## b int main (int argc, char **argv) { concat (pri, ntf) ("Hello world\n"); exit (0); } 

¿Y por qué el nivel extra de indirección? Como Deduplicator señala en los comentarios a su respuesta a continuación, sin eso, concatenará los términos literales especificados, en lugar de los términos sustituidos con macro. Una lista útil de tales escollos está aquí .

CAT2 y CAT3 son las macros que deberían llamarse, las otras dos son parte de su trabajo interno.

 #define CAT2(a,b) CAT2EXP(a, b) #define CAT2EXP(a,b) a ## b 

Entonces, ¿qué pasa si llamas CAT2 ?

Bueno, primero se reemplaza CAT2 , cuya macro expande los argumentos literales:

 CAT2(a_eval, b_eval) 

El cual es reemplazado por la concatenación de ambos argumentos para hacer un token, por el operador de concatenación de token ## .