我對C預處理器的工作方式有疑問。我寫了下面的代碼。當使用OPREP(n)
時,它應該是這樣的: OP(0,OP(1,OP(2,OP(3, .... OP(n,
。然後我想實現的是當我添加如whatever)))))))
與n
右括號,我應該得到 OP(0,OP(1,OP(2,OP(3, .... OP(n,whatever)))))))
這應該評估到 0 1 2 3 4 5 .... n whatever
。未評估其他宏評估產生的宏
#include <boost/preprocessor/comma.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#define OP(a,b) a b
#define T0() OP
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA()
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a)
OPREP(2) 3))
當我編譯,並期待在預處理器輸出我得到: OP(0 , OP(1 , 3))
。那是它沒有評估結果OP()宏。 我的問題是爲什麼,我如何強制它被評估?
聽起來有點像XY問題給我;實際上想要輸出什麼?你爲什麼要手動輸入表達式的右半部分並生成左邊的部分? –
@ m.s。這是一個最小的例子。實際上宏'OP'有3個參數 - 運行計數器,text1和text2。每個嵌套的OP調用的text1和text2都會發生很大的變化(因此我希望能夠編輯它們,而不是像這個例子中的那樣只是一個單獨的參數'whatever',而是'n''嵌套'whatever's)。雖然正確的部分不會改變 - 它只是一個運行計數器的OP。如果n = 20,寫入OP(0,OP(1,OP(2 20次)會非常煩人,我意識到可以有其他的實現,我可以想到幾個,但是我想知道爲什麼這個沒有工作 –