2009-08-10 11 views
14

Mam sytuację, w której mam kilka generowanych funkcji i chciałbym wskazać im niektóre ogólne funkcje, które utworzyłem (aby umożliwić ponowne użycie kodu bazowego, gdy wygenerowane nazwy funkcji ulegają zmianie).C definiowanie pre-procesora dla wygenerowanych nazw funkcji

Zasadniczo mam listę nazw funkcji w następujący sposób:

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

Gdy te są generowane, chciałbym zdefiniować makro, aby mogły być nazywane ogólnie. Mój pomysł był, ale nie miałem szczęścia wdrożenie go ... jak C pre-procesor bierze nazwę makra zamiast co makro jest zdefiniowany jako:

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

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

Emisja jest to, że mogę otrzymać

void Callback_SIGNAL1(void) 

zamiast

void Callback_SignalName1(void) 

Czy istnieje dobry sposób obejścia tego?

+0

nie powinno być #define FUNCTION_NAME (Nazwafunkcji) void Nazwafunkcji (void)? –

+0

Przepraszam, zredagowałem dla nieco więcej wyjaśnień ... Pominąłem ważną część, że jest tam inna część nazwy funkcji, która tam wchodzi ... – espais

+0

Zauważ, że ## pomiędzy 'signal' i' (void) ' nie jest poprawne. ## służy do tworzenia pojedynczego tokena poprzez łączenie wielu tokenów. Otwarty nawias nie może być (i nie powinien być!) Częścią tokena, który będzie nazwą funkcji. –

Odpowiedz

27

Trzeba zapewnić dodatkowy poziom „Funkcja makro-like” w celu zapewnienia właściwego rozbudowa:

np

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

wyjściowa:

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







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

w rzeczywistości; w przeciwnym wypadku operator ## połączy konkluzję dosłownie z Callback_. – Adriaan

+0

dzięki Charles ... Doceniam to! – espais

Powiązane problemy