2009-05-06 12 views
3

高次関数をシミュレートするために他のマクロの引数としてマクロ名を与えるのは "安全"ですか?(高次の)マクロでどれくらいのことができますか?

I.e.足で自分を撃たないためにどこを見なければならないのですか?

ここではいくつかの抜粋は以下のとおりです。

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; } 
#define foreach_odd(ii, instr) for(int ii = 1; ii < 100; ii += 2) { instr; } 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

部分適用については、私はそれを何ができますか? :

#define foreach(ii, start, end, step, instr) \ 
    for(int ii = start; ii < end; ii += step) { instr; } 

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr) 
#define foreach_odd(ii, instr) foreach(ii, 1, 100, instr) 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

マクロ内にマクロを定義できますか?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x) 

答えて

3

可能な限りプリプロセッサを使用している場合は、boost.preprocessorを試してみるとよいでしょう。

しかし、それはそうする安全ではないことに注意してください。例えば、カンマは、プリプロセッサを使用するときに非常に多くの問題を引き起こします。プリプロセッサが生成しているコードを理解できない(または理解しようとしている)ことを忘れないでください。

私の基本的なアドバイスは、「しないでください」または「できるだけ慎重に行ってください」です。

1

私は腐った小さなユニットテストフレームワークを完全にcプリプロセッサで実装しました。何十ダースのマクロ、たくさんのマクロが別のマクロタイプのものへの議論です。

この種のものはではありません。「安全」という言葉のベストプラクティスの意味です。足に自分を撃つ微妙で非常に強力な方法があります。単体テストのプロジェクトは手を抜いたおもちゃです。

マクロ定義をネストできるかどうかわかりません。私はそれを疑うが、私はしようと行くよ... gccはそれを好きではない、と

nested_macro.cc:8: error: stray '#' in program
nested_macro.cc:3: error: expected constructor, destructor, or type conversion before '(' token
nested_macro.cc:3: error: expected declaration before '}' token

セルフプラグで応答:あなたが興味を持っている場合、ユニットテストフレームワークはhttps://sourceforge.net/projects/dut/

で見つけることができます
関連する問題