C / C ++ Concatenación de cadenas de macros

#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 

¿Es posible concatenar tener STR3 == “s1”? Puedes hacer esto pasando args a otra función Macro. ¿Pero hay una manera directa?

Si son ambas cadenas, puedes hacer lo siguiente:

 #define STR3 STR1 STR2 

El preprocesador concatena cadenas adyacentes automáticamente.

EDITAR:

Como se señala a continuación, no es el preprocesador sino el comstackdor el que realiza la concatenación.

No necesita ese tipo de solución para los literales de cadena, ya que están concatenados en el nivel de idioma, y ​​no funcionaría de todos modos porque “s” “1” no es un token de preprocesador válido. Sin embargo, para pegar fichas generales, intente esto:

 /* * Concatenate preprocessor tokens A and B without expanding macro definitions * (however, if invoked from a macro, macro arguments are expanded). */ #define PPCAT_NX(A, B) A ## B /* * Concatenate preprocessor tokens A and B after macro-expanding them. */ #define PPCAT(A, B) PPCAT_NX(A, B) 

Entonces, por ejemplo, PPCAT(s, 1) produce el identificador s1 .

Continuando con el tema son estas macros:

 /* * Turn A into a string literal without expanding macro definitions * (however, if invoked from a macro, macro arguments are expanded). */ #define STRINGIZE_NX(A) #A /* * Turn A into a string literal after macro-expanding it. */ #define STRINGIZE(A) STRINGIZE_NX(A) 

Entonces,

 #define T1 s #define T2 1 STRINGIZE(PPCAT(T1, T2)) // produces "s1" 

Sugerencia: la macro STRINGIZE arriba es buena, pero si comete un error y su argumento no es una macro, tiene un error ortográfico en el nombre, u olvidó #include el archivo de encabezado, entonces el comstackdor pondrá felizmente la supuesta macro nombre en la cadena sin error

Si tiene la intención de que el argumento para STRINGIZE sea ​​siempre una macro con un valor C normal, entonces

 #define STRINGIZE(A) ((A),STRINGIZE_NX(A)) 

lo expandirá una vez y comprobará su validez, lo descartará y luego lo expandirá nuevamente en una cadena.

Me tomó un tiempo descubrir por qué STRINGIZE(ENOENT) terminaba como "ENOENT" lugar de "2" … No había incluido errno.h .