ホームページ  >  記事  >  バックエンド開発  >  MSVC が VA_ARGS を可変引数マクロ展開の単一の引数として扱うのはなぜですか?また、これを回避するにはどうすればよいですか?

MSVC が VA_ARGS を可変引数マクロ展開の単一の引数として扱うのはなぜですか?また、これを回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 14:29:02556ブラウズ

Why does MSVC   treat VA_ARGS as a single argument in variadic macro expansion, and how can this be worked around?

MSVC での可変個引数マクロ展開

C プログラミングの世界では、マクロは再利用可能なコード スニペットを定義する便利な方法を提供します。ただし、Microsoft の Visual C (MSVC) コンパイラで可変個引数マクロを調べると、障害が発生する可能性があります。この記事では、開発者によって提起された問題を詳しく掘り下げ、GCC で見られるものと同様の可変個引数マクロ展開を有効にする回避策を紹介します。

問題の説明

当面の問題このマクロには、GCC では問題なく展開できますが、MSVC では問題が発生します。具体的には、問題のマクロはすべての VA_ARGS (可変引数) を 1 つの引数として扱うことによって誤動作します。以下は問題のコードの抜粋です:

<code class="cpp">#define VA_NARGS_IMPL(__1, __2, __3, __4, __5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)</code>

このマクロは、渡された引数の数をカウントするように設計されています。ただし、MSVC はすべての VA_ARGS を 1 つの引数として誤って解釈し、その結果、カウントが正しくなくなります。

回避策

質問者は複製する手法を模索していましたが、 MSVC における GCC の望ましい動作については、ソース スレッドで Jeff Walden によって素晴らしい解決策が提案されました。この回避策では、以下に示すように、各可変長引数マクロのヘルパー マクロの宣言が必要です。

<code class="cpp">#define FOO_CHOOSE_HELPER1(macro, count, ...) macro##count(__VA_ARGS__)
#define FOO_CHOOSE_HELPER2(macro, count, ...) FOO_CHOOSE_HELPER1(macro, count)
#define FOO(...) FOO_CHOOSE_HELPER2(FOO, COUNT_ARGS(__VA_ARGS__), __VA_ARGS__)</code>

COUNT_ARGS マクロは、可変長引数マクロ FOO とヘルパー マクロ FOO_CHOOSE_HELPER1 に渡される引数の数を決定するために使用されます。

結論

この回避策は MSVC の可変個引数マクロ展開の問題に効果的に対処しますが、宣言が必要です。可変個引数マクロごとにヘルパー マクロを作成しますが、大規模なコードベースでは煩雑になる可能性があります。それにもかかわらず、MSVC プロジェクトで同様の課題に直面している人にとっては、実行可能なソリューションを提供します。

以上がMSVC が VA_ARGS を可変引数マクロ展開の単一の引数として扱うのはなぜですか?また、これを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。