2015-05-08 30 views
1

我想弄清楚如何編寫一個C預處理器宏,可以接受部分函數名稱和一段文本來追加到函數名稱以及一組參數來創建實際的函數名稱和函數調用。這個想法是結合前兩個宏參數來創建函數名稱,然後將其餘的宏參數添加爲創建的函數名稱的參數。如何編寫一個宏,將文本附加到部分函數名稱以創建完整的函數名稱

所以,我要實現以下目標:

MACRO(foo, postfix, ...) 
----> foo_postfix(__VA_ARGS__) 

舉例來說,如果我有幾個C函數,func_test1()func_test2()func_test3()然後我希望能夠使用宏來指定func作爲第一個參數和test1作爲第二個參數,以便宏將創建函數名稱func_test1()或指定func作爲第一個參數,並將test2作爲第二個參數,以便宏創建函數名稱func_test2

或類似

#define MACRO(foo,postfix,...) "macro to combine foo and postfix into actual function name" 

,然後我可以用這個宏像

MACRO(func, test1, a, b, c); // will create func_test1(a, b, c); 
MACRO(func, test2, i, x);  // will create func_test2(i, x); 

目前似乎並沒有來做到這一點的簡單方法。

+0

你試圖解決什麼是真正的問題? – EJP

+0

@EJP我想根據編譯器標誌調用不同的函數。 – Phonon

回答

4

您可以使用##在宏連接兩個參數爲字符串。所以,如果您的宏

MACRO(foo, postfix, ...) 

你可以定義它像這樣

MACRO(foo, postfix, ...) foo##_##postfix(__VA_ARGS__) 
           ^^^ adds an underscore in the middle. Don't include if you 
           don't want the underscore. 

來連接foopostfix在兩者之間具有下劃線。

當使用這些類型的宏的宏參數時要小心。該參數被粘貼而沒有進行宏觀擴展,因此MACRO(foo, MYMACRO, ~)將擴展爲foo_MYMACRO()而不是MYMACRO的值。

0

C預處理器允許您使用##將令牌「粘合」在一起。

這意味着

#define MACRO(x, y) x ## _ ## y 
MACRO(foo, postfix) 

會變成

foo_postfix 
相關問題