2014-12-06 28 views
2

我想將預處理指令嵌入到函數名中。基本上我想製作一個宏,它將預處理器定義作爲參數,並將其定義的VALUE連接起來以獲取函數名稱。將預處理器指令嵌入到函數名中

基本上這樣的:

#define PREFIX foo 
#define CALL(P, x) _##P_bar(x) 

...then 
CALL(PREFIX, x) should become _foo_bar(x) 

不幸的是這會導致_P_bar而不是_foo_bar

是否有可能使其工作如上?

+0

請注意,全局範圍中以下劃線開頭的名稱是爲編譯器和庫保留的。你不應該使用這些。 – 2014-12-06 12:36:51

回答

4

C標準定義了緊接在##之後的宏參數的特殊行爲。在這種情況下,它們沒有完全展開。這就是爲什麼你的代碼不符合你的預期。爲了進一步擴展一個參數,你必須以不會立即跟隨或緊隨##運算符的方式來使用它。請嘗試以下操作:

#define PREFIX foo 
#define CALL2(P,x) _##P##_bar(x) 
#define CALL(P, x) CALL2(P,x) 

CALL(PREFIX, x) 
+0

你確定'#define CALL(P,x)_ ## P ## _ bar(x)'不起作用。我想這個問題只是確定'P'宏參數becouse下劃線隱藏它,目標是做兩個連接,而不是一個。 – 2014-12-06 13:37:18

+0

@ Micheled'Amico是的。我檢查過了。 'CALL(P,x)_ ## P ##_ bar(x)'不起作用。 – Marian 2014-12-06 14:36:06

+0

非常感謝。這太棒了! :) – user2826084 2014-12-08 16:13:38