Estoy tratando de averiguar cómo puedo concatenar un #define
'd 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 forma en que puedo hacer que funcione es hacer una copia del número de versión definido como cadenas.
Lo más cercano que pude encontrar fue un método para citar argumentos 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 la #
s porque los valores son números y se expandiría a "/home/user/.myapp" 2 6
, que no es C válido .
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
c
c-preprocessor
stringification
jonescb
fuente
fuente
Respuestas:
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á al preprocesador expandir las macros antes de que se conviertan en cadenas.
fuente
#
solo funciona con argumentos macro. Sin embargo, laSTR_HELPER
macro es necesaria para evitar convertir la macroMAJOR_VER
en la cadena"MAJOR_VAR"
, donde queremos que sea el resultado"2"
.Una forma de trabajo es escribir MY_FILE como una macro paramétrica:
#define MY_FILE(x,y) "/home..." #x #y
EDITAR: Como señaló "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)
fuente
MY_FILE
son macros, digamosA
yB
, esta macro se expandirá a"/home..." "A" "B"
.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)
fuente
C
etiqueta.