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
マクロ力の余分な展開ということである。
これらのカンマがどこから来るのか、またそれらを「遮蔽」する必要があるかについて、具体的に説明できますか?あなたは 'MYMACRO(1,2,3) 'のようなことをしたいと思っていて、何とか' 1,2が一つの引数であることを伝えますか? – user2357112
括弧はカンマを保護しますが、バリデーションマクロを使わないでマクロ出力からそれらを削除するのは難しいでしょう。 (まあ、IDKなしでそれをする方法、おそらく何かを思い付くでしょう。) – PSkocik
@PSkocik最近誰かの可変的なマクロを持っていないのですか? – o11c