2009-08-10 6 views
14

Tengo una situación en la que tengo bastantes funciones generadas, y me gustaría apuntarlas a algunas funciones genéricas que he creado (para permitirme reutilizar el código base cuando los nombres de las funciones generadas cambian).Definición del pre-procesador C para nombres de funciones generadas

Esencialmente, tengo una lista de los nombres de las funciones de la siguiente manera:

void Callback_SignalName1(void); 
void Callback_SignalName2(void); 
...etc 

Una vez que estos se generan, me gustaría definir una macro para que puedan ser llamados genéricamente. Mi idea era esto, pero no he tenido suerte ... implementarlo como el C pre-procesador toma el nombre de la macro en lugar de lo que la macro se define como:

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

#define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void)) 
... 
... 
FUNCTION_NAME(SIGNAL1) 
{ 
    .. 
    return; 
} 

La cuestión es que recibo

void Callback_SIGNAL1(void) 

en lugar de

void Callback_SignalName1(void) 

¿hay una buena manera de evitar esto?

+0

¿no debería ser FUNCTION_NAME #define (nombreFunc) nombreFunc (void)? –

+0

Lo siento, editado para aclarar un poco más ... Dejé fuera una parte importante de que hay otra parte del nombre de la función para entrar allí ... – espais

+0

Tenga en cuenta que el ## entre 'señal' y' (vacío) ' no es correcto. ## es para crear un solo token mediante la concatenación de tokens múltiples. El paréntesis abierto no puede ser (¡y no debería ser!) Parte del token que será el nombre de la función. –

Respuesta

27

es necesario proporcionar un nivel adicional de "macro-función como" para asegurar la expansión adecuada:

por ejemplo,

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

#define MAKE_FN_NAME(x) void Callback_ ## x (void) 
#define FUNCTION_NAME(signal) MAKE_FN_NAME(signal) 

FUNCTION_NAME(SIGNAL1) 
{ 
    return; 
} 

de salida:

$ gcc -E prepro.cc 
# 1 "prepro.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "prepro.cc" 







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

de hecho; de lo contrario, el operador ## simplemente concatenará el argumento literalmente en Callback_. – Adriaan

+0

gracias Charles ... ¡Lo aprecio! – espais

Cuestiones relacionadas