我想將預處理指令嵌入到函數名中。基本上我想製作一個宏,它將預處理器定義作爲參數,並將其定義的VALUE連接起來以獲取函數名稱。將預處理器指令嵌入到函數名中
基本上這樣的:
#define PREFIX foo
#define CALL(P, x) _##P_bar(x)
...then
CALL(PREFIX, x) should become _foo_bar(x)
不幸的是這會導致_P_bar
而不是_foo_bar
。
是否有可能使其工作如上?
我想將預處理指令嵌入到函數名中。基本上我想製作一個宏,它將預處理器定義作爲參數,並將其定義的VALUE連接起來以獲取函數名稱。將預處理器指令嵌入到函數名中
基本上這樣的:
#define PREFIX foo
#define CALL(P, x) _##P_bar(x)
...then
CALL(PREFIX, x) should become _foo_bar(x)
不幸的是這會導致_P_bar
而不是_foo_bar
。
是否有可能使其工作如上?
C標準定義了緊接在##之後的宏參數的特殊行爲。在這種情況下,它們沒有完全展開。這就是爲什麼你的代碼不符合你的預期。爲了進一步擴展一個參數,你必須以不會立即跟隨或緊隨##運算符的方式來使用它。請嘗試以下操作:
#define PREFIX foo
#define CALL2(P,x) _##P##_bar(x)
#define CALL(P, x) CALL2(P,x)
CALL(PREFIX, x)
你確定'#define CALL(P,x)_ ## P ## _ bar(x)'不起作用。我想這個問題只是確定'P'宏參數becouse下劃線隱藏它,目標是做兩個連接,而不是一個。 – 2014-12-06 13:37:18
@ Micheled'Amico是的。我檢查過了。 'CALL(P,x)_ ## P ##_ bar(x)'不起作用。 – Marian 2014-12-06 14:36:06
非常感謝。這太棒了! :) – user2826084 2014-12-08 16:13:38
請注意,全局範圍中以下劃線開頭的名稱是爲編譯器和庫保留的。你不應該使用這些。 – 2014-12-06 12:36:51