Estou tentando descobrir como posso concatenar um #define
'd int em uma #define
string' d usando o pré-processador C. Meu compilador é o GCC 4.1 no CentOS 5. A solução também deve funcionar para o MinGW.
Gostaria de anexar um número de versão a uma string, mas a única maneira de fazer funcionar é fazer uma cópia do número da versão definido como strings.
A coisa mais próxima que consegui encontrar foi um método de citar argumentos de macro, mas não funciona para #define
s
Isso não funciona.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Também não funciona sem o #
s porque os valores são números e ele se expandiria para "/home/user/.myapp" 2 6
, o que não é C válido .
Isso funciona, mas eu não gosto de ter cópias das definições de versão porque eu preciso delas como números também.
#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
fonte
fonte
Respostas:
Pergunta clássica do pré-processador C ....
O nível extra de indireção permitirá que o pré-processador expanda as macros antes de serem convertidas em strings.
fonte
#
só funciona com argumentos de macro. No entanto, aSTR_HELPER
macro é necessária para evitar a transformação da macroMAJOR_VER
na string"MAJOR_VAR"
, onde queremos que o resultado esteja"2"
.Uma maneira prática é escrever MY_FILE como uma macro paramétrica:
EDIT: Conforme observado por "Lindydancer", esta solução não expande macros em argumentos. Uma solução mais geral é:
fonte
MY_FILE
forem macros, digaA
eB
, essa macro se expandirá para"/home..." "A" "B"
.Você pode fazer isso com BOOST_PP_STRINGIZE :
fonte
C
tag.