2009-08-10 7 views
14

私はかなりの生成関数を持っていますが、私が作成したいくつかの汎用関数を指し示したいと思います。生成された関数名が変更されます)。これらが生成されたら生成された関数名のために定義されたCプリプロセッサ

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

、私はそれらを総称することができるようにマクロを定義したいと思います:次のように

基本的に、私は、関数名のリストを持っています。

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

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

問題:Cプリプロセッサではなく、マクロは次のように定義されているもののマクロの名前を取るよう...私の考えでは、このでしたが、私はそれを実装するすべての運を持っていませんでした私は

void Callback_SIGNAL1(void) 

代わりの

void Callback_SignalName1(void) 

これを回避する良い方法はありますを受けるということですか?

+0

、それはすべきではないの#define FUNCTION_NAME(FUNCNAME)のボイドFUNCNAME(無効)? –

+0

申し訳ありません、もう少し明確に編集しました...そこに入る関数名の別の部分があるという重要な部分は除外しました... – espais

+0

'signal'と'(void) 'の間の##は、正しいものではありません。 ##は、複数のトークンを連結して単一のトークンを作成するためのものです。オープンカッコは、関数名となるトークンの一部であってはなりません。確かに –

答えて

27

あなたは適切な拡張性を確保するために、「関数のようなマクロ」の余分なレベルを提供する必要があります。

例えば

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

出力:

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







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

;それ以外の場合は、##演算子は文字通り引数をCallback_に連結します。 – Adriaan

+0

チャールズに感謝します...私はそれを感謝します! – espais

関連する問題