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