在一個示例項目,我定義的宏使用#定義列表作爲輸入到一個C預處理宏
#define FOO(x, y) x + y .
這工作得很好。例如,FOO(42, 1337)
評估爲1379
。
不過,我現在想用另一個#define
:
#define SAMPLE 42, 1337
當我現在請FOO(SAMPLE)
,這是不行的。編譯器告訴我FOO
有兩個參數,但只有一個參數被調用。
我想這是因爲,雖然宏的參數是在函數本身之前進行評估的,但預處理器在評估之後不會再分析整個指令。這類似於不能從宏輸出額外的預處理器指令的事實。
有沒有可能獲得所需的功能?
用C函數代替FOO
宏是不可能的。原始宏位於我無法更改的第三方代碼中,並且它輸出逗號分隔的值列表,以便在數組初始化器中直接使用。因此,C函數不能複製相同的行爲。
如果通過簡單的方法無法完成此任務:您將如何將(x, y)
對以可維護的形式存儲?就我而言,有8個參數。因此,將各個零件存放在單獨的#define
-s中也不易維護。
'FOO(42,1337)'不評估爲1379,它評估爲「42 + 1337」。預處理器僅執行文本替換。之後,當編譯器執行[常量摺疊](http://en.wikipedia.org/wiki/Constant_folding)時,是否進行了這種替換。 – 2012-04-24 21:20:36
重複的[是否有可能宏評估多個參數到另一個?](http://stackoverflow.com/questions/10234172/is-it-possible-to-a-macro-evaluate-multiple-arguments-to-另一個) – 2012-04-24 21:46:30
@Adam:true :-)然而,正如詹姆斯指出的那樣,我的問題是另一回事。我不是在刪除這個問題,以防其他人通過使用不同的關鍵字找到它。但是,投票結束。 – Etan 2012-04-24 21:49:54