2009-08-10 10 views
14

Ho una situazione in cui ho alcune funzioni generate e vorrei indirizzarle ad alcune funzioni generiche che ho creato (per permettermi di riutilizzare il codice base quando il i nomi delle funzioni generate cambiano).Definizione del pre-processore C per i nomi delle funzioni generate

Essenzialmente, ho un elenco dei nomi di funzione come segue:

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

volta che questi sono generati, desidero definire una macro per consentire loro di essere chiamati genericamente. La mia idea era questo, ma non ho avuto fortuna attuazione ... come il C pre-processore prende il nome della macro invece di ciò che la macro è definita come:

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

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

La questione è che ricevo

void Callback_SIGNAL1(void) 

invece di

void Callback_SignalName1(void) 

c'è un buon modo per aggirare questo?

+0

non dovrebbe essere FUNCTION_NAME # define (funcName) funcName void (void)? –

+0

Scusate, modificato per un po 'più di chiarezza ... Ho lasciato fuori una parte importante che c'è un'altra parte del nome della funzione per andare lì ... – espais

+0

Notate che il ## tra 'signal' e' (void) ' non è corretto. ## serve per creare un singolo token concatenando più token. La parentesi aperta non può essere (e non dovrebbe essere!) Parte del token che sarà il nome della funzione. –

risposta

27

è necessario fornire un ulteriore livello di "funzione macro-like" per garantire la corretta espansione:

esempio

#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; 
} 

uscita:

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







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

in effetti; altrimenti l'operatore ## concatenerà letteralmente l'argomento al Callback_. – Adriaan

+0

grazie Charles ... lo apprezzo! – espais

Problemi correlati