34

debugbuilds の場合、私は通常 Clang を使用します。これは、警告とエラーをより適切にフォーマットし、それらを追跡して修正するのを少し簡単にするためです。

しかし最近、可変引数を持つマクロを追加した後、Clang は (ダミー プロジェクトから) 次のことを教えてくれました。

main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...)  stuff_i(args)

macroname(args...)Visualstudio、Sunstudio、そしてもちろん GCC など、さまざまなコンパイラで問題なくコンパイルできることを私は知っています。しかし、clang が正しいことを確認するために、可変引数を展開する別の 2 つの方法を試しました。

番号 1:

#define stuff1(...)  stuff_i(...)

2番:

#define stuff2(...)  stuff_i(__VA_ARGS__)

両方で、次のメッセージが表示されます。

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]

... Variadic マクロが実際に C++ の標準の一部であるかどうか疑問に思います (もちろん、プリプロセッサが独立して解釈されることはわかっています)。

4

4 に答える 4

41

ウィキペディアを引用:

可変引数マクロは、1999 年に C 言語標準の ISO/IEC 9899:1999 (C99) リビジョンで導入され、2011 年に C++ 言語標準の ISO/IEC 14882:2011 (C++11) リビジョンで導入されました。

したがって、C99 および C++11 以降では標準ですが、C++03 では GNU 拡張です。

于 2011-01-24T20:14:22.847 に答える
30

C++11 の時点で、可変個引数マクロが標準 C++ に含まれるようになりました。C++11 標準のセクション 16.3 では、C99 の可変個引数マクロ (問題の 2 番目の形式) と互換性があるように可変個引数マクロを指定しています。

以下は、C++ での標準準拠の可変個引数マクロ定義の例です。

#define foo(x, y, ...)    bar(x, y, __VA_ARGS__)
于 2012-03-08T16:34:03.753 に答える
4

あなたの例「ナンバー2」の形では、それらはC99の標準であり、一般にC++コンパイラのプリプロセッサはCとC++のコンパイルで同じです。

また、C99 準拠に対する頑固な抵抗にもかかわらず、Microsoft VC++ もサポートされています。したがって、それと GCC の間には、それらの使用を避ける理由はほとんどありません。私が使用するほとんどの組み込みシステム コンパイラでさえ、それらはサポートされています。

ただし、GCC固有の「ナンバー1」形式は避けてください。これは間違いなく非推奨です。

于 2011-01-24T20:52:42.433 に答える
0

標準は16.3 マクロ置換で言います:

識別子 _ _ VA_ARGS _ _ は、パラメーターで省略記号表記を使用する関数のようなマクロの置換リストでのみ発生します。

于 2012-03-06T17:22:34.933 に答える