2009-08-10 103 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; 
} 

問題是我收到的

void Callback_SIGNAL1(void) 

代替

void Callback_SignalName1(void) 

有沒有解決這個好辦法?

+0

它不應該是的#define FUNCTION_NAME(了funcName)無效了funcName(無效)? – 2009-08-10 09:39:42

+0

對不起,編輯了一下更多的澄清...我留下了一個重要的組成部分,有函數名的另一部分去那裏...... – espais 2009-08-10 09:41:23

+0

注意signal'和'(無效)''之間的##是不正確的。 ##用於通過連接多個令牌來創建單個令牌。左括號不能是(也不應該是!)作爲函數名稱的標記的一部分。確實是 – 2009-08-10 09:46:41

回答

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 2009-08-10 10:02:21

+0

謝謝Charles ...我很感激! – espais 2009-08-10 10:07:35