2016-08-15 19 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'は実行中のカウンタtext1とtext2の3つの引数をとります。ネストされた各OP呼び出しのtext1とtext2の両方が大幅に変更されます(したがって、私はそれらを編集できるようにしたい、そして、この例のようなただ一つのパラメータ '何でも'ではなく 'n'のネストされた'右の部分は変更されませんが、それはランニングカウンタを持つ単なるOPです。 n = 20の場合、OP(0、OP(1、OP(2 20 times))を書くのはかなり厄介なことになるかもしれませんが、他の実装もあると思います。 –

答えて

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

関連する問題