2016-08-15 80 views
0

我對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()宏。 我的問題是爲什麼,我如何強制它被評估?

+0

聽起來有點像XY問題給我;實際上想要輸出什麼?你爲什麼要手動輸入表達式的右半部分並生成左邊的部分? –

+0

@ m.s。這是一個最小的例子。實際上宏'OP'有3個參數 - 運行計數器,text1和text2。每個嵌套的OP調用的text1和text2都會發生很大的變化(因此我希望能夠編輯它們,而不是像這個例子中的那樣只是一個單獨的參數'whatever',而是'n''嵌套'whatever's)。雖然正確的部分不會改變 - 它只是一個運行計數器的OP。如果n = 20,寫入OP(0,OP(1,OP(2 20次)會非常煩人,我意識到可以有其他的實現,我可以想到幾個,但是我想知道爲什麼這個沒有工作 –

回答

1

我想通了。要強制另一個評價我需要做的就是添加一個虛擬FORCE_EVAL宏計算結果爲同樣的事情,它的參數和包圍我的電話是:

#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) 
#define FORCE_EVAL(...) __VA_ARGS__ 

FORCE_EVAL(OPREP(2) 3))) 
+0

不要忘記接受你自己的答案。 – llonesmiz