Estou gerando um código de tempo de compilação. Preciso anexar um sufixo a um nome de função gerado, com base em um macro booleano. O sufixo está presente ou vazio. Como fazer isso?
#define FUNC_NAME(name, hasSuffix) name ## MAYBE_SHOW_SUFFIX(hasSuffix)
FUNC_NAME(foo, true); // would generate: foo_
FUNC_NAME(foo, false); // would generate: foo
Use o fato de que o resultado de uma expansão macro é expandido novamente:
Resultado
https://godbolt.org/z/EEM938jx9
Note que isso só funciona porque expande a macro
WITHSUFFIX_true
ouWITHSUFFIX_false
dada a condiçãotrue
oufalse
exatamente . Não funcionará para outros valores como1
or!0
ou similares.Uma alternativa um tanto exagerada seria permitir estes dois formulários (e somente estes formulários):
Onde
suffix
poderia haver qualquer coisa que você queira que o chamador digite ao chamar a macro,true
etc.Podemos escrever isso como:
Caso não haja argumentos,
__VA_ARGS__
se resume a nada. Caso contrário, ele se transforma em qualquer coisa que o chamador tenha digitado ali,suffix
que esperançosamente é a única entrada válida aqui (ou haverá erros do compilador).Então definimos uma macro chamada quando não havia parâmetros extras, que apenas chama a função:
E uma macro que anexa o sufixo. Supondo que temos alguma macro
#define SUFFIX _
, precisamos de algumas macros auxiliares para expansão antes da concatenação de tokens:Exemplo completo:
Saída: