objective concatenate c c-preprocessor stringification

concatenate objective c



Concatenar int a string usando C Preprocessor (3)

Estoy tratando de averiguar cómo puedo concatenar un #define ''int int a un #define '' d string usando el preprocesador C. Mi compilador es GCC 4.1 en CentOS 5. La solución también debería funcionar para MinGW.

Me gustaría agregar un número de versión a una cadena, pero la única manera de hacerlo funcionar es hacer una copia del número de versión que se define como cadenas.

Lo más cercano que pude encontrar fue un método para citar argumentos de macro, pero no funciona para #define s

Esto no funciona.

#define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

Tampoco funciona sin los # s porque los valores son números y se expandirían a "/home/user/.myapp" 2 6 , que no es válido para C.

Esto funciona, pero no me gusta tener copias de la versión definida porque también las necesito como números.

#define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING


Pregunta clásica del preprocesador C ....

#define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

El nivel adicional de indirección permitirá que el preprocesador expanda las macros antes de convertirlas en cadenas.


Puedes hacerlo con BOOST_PP_STRINGIZE :

#define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)


Una forma de trabajo es escribir MY_FILE como una macro paramétrica:

#define MY_FILE(x,y) "/home..." #x #y

EDITAR: Como lo señala "Lindydancer", esta solución no expande las macros en los argumentos. Una solución más general es:

#define MY_FILE_(x,y) "/home..." #x #y #define MY_FILE(x,y) MY_FILE_(x,y)