2017-09-19 11 views
-1

Cのマクロ引数でコメントを保護する一般的な方法はありますか?私は、この目的のために括弧を使うことができることを知っていますが、括弧を追加するとマクロ出力に構文エラーが生じる場合は機能しません。私はGCCのコンマを守るために({})働いていると聞いたことがありますが、VC++(マクロのコンマに関するC標準に準拠した最近のバージョンの1つ)で動作するにはこのコードが必要です。私も私のケースではバリデックのマクロを使用することはできません。C:マクロ引数でカンマをシールドする方法は?

私がしようとしている具体的なケースはこれです(lengthofは別の場所で定義されたマクロです)。私はこれが何度も使用され、マルチ・マクロ・ソリューションを使用すると、大量の追加テスト・コードが追加されるため、全体として単一のマクロを作成しようとしています。

#define TEST_UNFUNC(func, res_type, res_set, op_type, op_set) \ 
{ \ 
    static const res_type res[] = res_set; \ 
    static const op_type op[] = op_set; \ 
    int i; \ 
    for (i = 0; i < MIN(lengthof(res), lengthof(op)); i++) \ 
     assert(func(op[i]) == res[i]); \ 
} 

可能であれば、この特定のマクロに固有の回避策ではなく、一般的な回答が必要です。

#include <stdio.h> 

#define really_unparen(...) __VA_ARGS__ 
#define invoke(expr) expr 
#define unparen(args) invoke(really_unparen args) 


#define fancy_macro(a) printf("%s %s\n", unparen(a)) 

int main() 
{ 
    fancy_macro(("Hello", "World")); 
} 

ここにトリックはreally_unparenすることができ、invokeマクロ力の余分な展開ということである。

+0

これらのカンマがどこから来るのか、またそれらを「遮蔽」する必要があるかについて、具体的に説明できますか?あなたは 'MYMACRO(1,2,3) 'のようなことをしたいと思っていて、何とか' 1,2が一つの引数であることを伝えますか? – user2357112

+0

括弧はカンマを保護しますが、バリデーションマクロを使わないでマクロ出力からそれらを削除するのは難しいでしょう。 (まあ、IDKなしでそれをする方法、おそらく何かを思い付くでしょう。) – PSkocik

+1

@PSkocik最近誰かの可変的なマクロを持っていないのですか? – o11c

答えて

0

使用すると、以下の例で定義され、マクロ特別unparenを介してそれらを通過し、その後にコンマを遮蔽するために括弧、およびソースに括弧で囲まれていなくても呼び出されます。

編集:以下のコメントごとに、この場合は必要ありません。私はそれが必要なケースを打ったと確信していますがいつか ...それは傷つきません。

+0

私は '#define fancy_macro(a)printf("%s%s \ n "、本当にunparen a)で十分であると信じています(' invoke'と 'unparen'マクロは必要) – PSkocik

+0

...ハァッ。それから、20分前に*働かなかったのは何でしたか? – o11c

+1

マクロ地獄への良い方法のように見えます。ハッピーデバッグ。 – Olaf

関連する問題