問題タブ [variadic-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3491 参照

c++ - 引数が渡されない場合、 #__VA_ARGS__ は何を生成するはずですか?

コード例:

Visual C++ (バージョン 14 CTP) で前処理し、次を取得します。

最後の行で#__VA_ARGS__は、無に変わります。「」になったほうがいいです。

何が起こるかについての決定的な参照はありますか?私はたくさんグーグルで検索しましたが、見つかりませんでした。

提案された回避策も役立ちます。

0 投票する
1 に答える
98 参照

c++ - 可変量の引数を持つ関数を定義するマクロを実行する簡単な方法はありますか?

可変量の引数を持つ関数を定義するマクロがあります。マクロには、どの実際の関数を呼び出す必要があるかを決定するロジックがあります。私の現在のアプローチは次のとおりです。

私はそれを次のように使用します:

それを行うためのより良い方法があるかどうか疑問に思っていました。

注:宣言された(my_func私の例では)関数は、スーパークラスからメソッドを再実装するために使用されるため、テンプレート(私が知っているもの)を使用するアプローチは私の問題を解決しません。

Edit2:適切な可変個引数テンプレート関数を使用しても、スーパークラスの関数をオーバーライドするため、関数を宣言するマクロが必要です。

0 投票する
1 に答える
1686 参照

c++ - 文字列化 __VA_ARGS__ (C++ 可変個引数マクロ)

持ってみましょう

そして、私は書きたい:

マクロで

これ#__VA_ARGS__は gcc ではうまくコンパイルされますが、VStudio ではエラーが発生します。堅牢でポータブルなソリューションはありますか?

ITEM()の異なる #definitions で複数回含まれる .h ファイルにのコレクションが必要ですITEM

0 投票する
5 に答える
1931 参照

c++ - さまざまな数の情報引数を使用して c++ assert マクロを作成する方法は?

dbgassert標準に似たマクロを作成しようとしていますassert。何を行うかに加えて、任意の数の追加パラメーター (デバッグ情報を含む)を出力assertしたいと考えています。dbgassert

私がこれまでに持っているものを以下にリストします。これは、この SO answerから改作されています。しかし、可変個引数テンプレートまたはマクロのいずれかでコードに問題があります。少なくとも 1 つの追加の引数 (OK 行) を使用すると、dbgassert期待どおりに機能します。しかし、追加の引数を指定しないと、コンパイルが失敗します (問題の行)。

可変個引数テンプレート プログラミング (タプルを出力する方法など) の経験はありますが、可変個引数マクロは使用したことがありません。

この可変引数マクロの組み合わせを記述する適切な方法を説明してください。

ところで、誰か#EXがマクロの魔法について説明してくれませんか? それは式を示し、gcc4.8.1 で動作します。普遍的にサポートされていますか?

ありがとう、


コード:


コードの元のバージョン。

0 投票する
2 に答える
39264 参照

c - マクロの __VA_ARGS__ とはどういう意味ですか?

C プログラミングのさまざまなヘッダーでこの表記を見たことがあります。基本的には引数を渡すことを理解していましたが、この「3 つのドット表記」が何と呼ばれているのかわかりませんでした。

誰かが例を挙げて説明したり、VA Args についてのリンクを提供したりできますか?

0 投票する
1 に答える
1011 参照

c++ - C++ プリプロセッサは、可変個引数マクロの呼び出しで空白を削除します (Solaris Studio 12.3)

Oracle Solaris Studio 12.3 の C++ プリプロセッサは、展開時に空白を完全に削除します__VA_ARGS__

システムでこの動作を確認できる人はいますか? それは既知のコンパイラのバグですか? この問題の回避策はありますか?

説明のために、簡単なテスト プログラムを次に示しますvaargs.c

C プリプロセッサは期待どおりに動作します。

ただし、C++ プリプロセッサは「hello」と「world」の間のスペースを削除します。

0 投票する
2 に答える
2153 参照

c - fprintf で Variadic マクロを使用する方法

マクロを作成してログをファイルに出力しようとしています。私のマクロは次のようになります。

そして、次の形式で LOG を呼び出す予定です。

しかし、コンパイルするとエラーが発生します

誰かが私がどこで間違っているのか説明してもらえますか?

0 投票する
2 に答える
1060 参照

c++ - すべての引数の可変マクロ置換は可能ですか?

私は現在、可変引数マクロに関する SO に関するかなりの数の質問を読んでいますが、最も単純な質問に誰も答えていないようです:

すべての引数に対してIDENTITY_FOR_ALL展開する方法はありますか? IDENTITY(X)任意の数の引数も可能ですか?

0 投票する
1 に答える
134 参照

c - このマクロ引数カウント戦術は合法ですか?

C Preprocessor、Macro "Overloading"VA_NARGSで説明されているように、しばらく前からマクロを認識していましたが 、それを機能させるために必要な大量のボイラープレートにいつも気が進まなかったのです。

最近、この機能が必要になったので、歯を食いしばって、必要なすべてのマクロ コードをすべて「栄光」の形で書きました。

私の特定のケースでは、すべての varargs 引数が特定の型であることを一貫して信頼できます。sizeofこれにより、おそらく配列型を使用するより良い方法があるのではないかと思いました。ローカル システムでこれを試してみましたが、うまくいくようです。ただし、このソリューションは脆弱である可能性があることを懸念しています(型の制限を超えています)。

私の質問は次のとおりです。これは実際、問題に対する安全で合理的​​な解決策ですか? または、おそらく: これを使用すると、結局、どのようなトラブルが発生するのでしょうか? そして最後に: 試行 (下記) に問題がある場合、一般的なアプローチを救うために適用できる微調整はありますか?

コードとデモmain()関数を次に示します。この場合、varargs 引数はすべて int でなければなりません:

ここにトランスクリプトがあります:

出力はreturn1()、関数が 2 回呼び出されていないことを確認するためのものです。


更新:

(int[]) { args }C99 であるが C++ ではないことがコメントで指摘されました。私の場合、問題のコードに C コンパイラを使用することは期待できますが、それでもこの特定の制限を知っておくとよいでしょう。

削除された回答で、C99 では varargs マクロ引数を少なくとも 1 つの実引数で埋める必要があることが指摘されました (ただし、仕様はその点でせいぜいあいまいだと思います)。私が手元に持っているコンパイラ (OS X の Clang) は、コードを受け入れますが、@ 2501 がコメントで適切に示しているように、-Wall実際には に文句を言います。-pedantic

-pedanticサイズがゼロの配列(引数なしの展開(int[]) { })についても文句を言いますが、これは常にダミー要素を含めることで修正できます。