Estoy tratando de crear una macro que tomará un prefijo predefinido y lo concatenará con el nombre de la función deseada en el argumento de la macro, pero no he tenido éxito.
Por ejemplo, mientras que esta es la firma de la función deseada:
void somePrefix__someFunc(int a)Sin embargo, cuando lo ejecuto y reviso la tabla de símbolos del programa, termino con la expansión de:
FUNC_PREFIXsomeFunc¿Qué estoy haciendo mal y cómo puedo hacerlo correctamente?
El código que estaba tratando de ejecutar:
#include <iostream> #define CONCAT(A, B) A##B #define FUNC_PREFIX somePrefix__ #define FUNC_NAME(_func) CONCAT(FUNC_PREFIX, _func) void FUNC_NAME(someFunc)(int a) { std::cout << a << std::endl; } int main() { FUNC_NAME(someFunc)(2); return 0; } PD: Intenté usar la macro sin un envoltorio CONCAT (tratando directamente de FUNC_PREFIX##_func ), pero aún así no funcionó.
El ## siempre se aplica antes de que se (re)escanee la macro "lista de reemplazo", por lo que en caso de que CONCAT se expanda antes que los demás elementos, no obtendremos el resultado deseado. Cada vez que terminamos con un ## en la lista de reemplazo durante el reemplazo de macros, se aplica antes de cualquier otro reemplazo.
Por lo tanto, necesita una macro de ayuda adicional para expandir FUNC_PREFIX , de modo que se expanda antes que CONCAT :
#include <stdio.h> #define CONCAT(A, B) A##B #define CONCAT_EXPAND(A, B) CONCAT(A,B) #define FUNC_PREFIX somePrefix_ #define FUNC_NAME(func) CONCAT_EXPAND(FUNC_PREFIX, func) void FUNC_NAME(someFunc)(int a) { printf("%s: %d\n",__func__, a); } int main() { FUNC_NAME(someFunc)(2); return 0; }Producción:
somePrefix_someFunc: 2