2009-08-10 7 views
14

Ich habe eine Situation, wo ich ziemlich viele generierte Funktionen habe, und möchte sie auf einige generische Funktionen zeigen, die ich erstellt habe (damit ich den Basiscode wiederverwenden kann) generierte Funktionsnamen ändern sich).C-Präprozessor, der für generierte Funktionsnamen definiert

Im Grunde habe ich eine Liste von Funktionsnamen wie folgt:

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

Sobald diese erzeugt werden, ich möchte ein Makro definieren, damit sie allgemein genannt werden. Meine Idee war, aber ich habe kein Glück hatte es die Umsetzung ... wie die C Pre-Prozessor den Namen des Makros nimmt statt dessen, was das Makro definiert ist als:

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

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

Die Frage ist, dass ich

void Callback_SIGNAL1(void) 

statt

void Callback_SignalName1(void) 

gibt es ein guter Weg, um dieses erhalten?

+0

sollte es nicht #define FUNCTION_NAME (funcName) void funcName (void) sein? –

+0

Sorry, bearbeitet für ein wenig mehr Klarstellung ... Ich habe einen wichtigen Teil weggelassen, dass es einen anderen Teil des Funktionsnamens gibt, um dorthin zu gehen ... – espais

+0

Beachten Sie, dass ## zwischen 'signal' und' (void) ' das ist nicht richtig. ## dient zum Erstellen eines einzelnen Tokens durch Verketten mehrerer Token. Die öffnende Klammer darf nicht Teil des Tokens sein (und nicht sein!), Das der Funktionsname ist. –

Antwort

27

Sie benötigen eine zusätzliche Ebene der „funktionsähnlichen Makros“, um die richtige Expansion zu gewährleisten:

z.B.

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

Ausgang:

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







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

tatsächlich; andernfalls verkettet der Operator ## das Argument einfach mit dem Callback_. – Adriaan

+0

danke Charles ... Ich weiß es zu schätzen! – espais

Verwandte Themen