問題タブ [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.
c - 空の可変引数を無視する
このコードは、すべてのパラメーターが HTML_A に渡されたときに期待どおりに機能します。
しかし、フォーマットに引数なしで HTML_A を呼び出したい場合:
gcc で次のコンパイル エラーが表示されます。
demo.c:17:1: 警告: ISO C99 では残りの引数を使用する必要があります
demo.c: 関数 'main' 内:
demo.c:17: エラー: ',' トークンの前に式が 必要です
cpp の戻り値:
,,
最後に。
c - マクロ カウント パラメータ
コンパイラを幸せにするためにA()
、渡されwarning: ISO C99 requires rest arguments to be used
たパラメータをカウントする必要があります。
この実装ではN_ARGS
、10 個のパラメーターしか使用できません。マクロに制限のない複数のパラメーターがあるかどうかを確認する別の方法はありますか?
gcc 拡張機能は知っている, ## __VA_ARGS__
が、警告を回避したい
c - 可変個引数マクロへの引数を逆にします
可変個引数マクロへの引数を逆にするにはどうすればよいですか?たとえば、
私の目標は、前と後ろの議論を分離することです。
c++ - MSVC++10と互換性のあるプリプロセッサ可変個引数FOR_EACHマクロ
FOR_EACH
可変個引数マクロのバリエーションを求めるいくつかの質問を見てきました。ただし、残念ながら、提供された回答は、別のマクロに渡されたときに1つの引数として__VA_ARGS __を展開するため、VC++10と互換性がありません。誰かがVC++10でまだ機能するC++11準拠(したがって上位互換)バージョンを提供してくれませんか。よく言われる「回避策」を使用しているかもしれませんが、たとえば、この回答の後者の一般化された部分をVC ++ 10で機能#define EXPAND(x) x
させるために、これをどこに置くかはわかりません。
明確にするために、意図された動作は、FOR_EACH(x, a, b, ...)
を生成することx(a) x(b), ...
です。ここで、xは別のマクロです。
c++ - 引数の数に応じて複数のマクロ呼び出しを生成する
この関数を繰り返して数回呼び出そうとしています。
以下のマクロを書きました。
等々 ...
引数の数がMETADATA_METHODS_IMPL_N
どこにあるかを呼び出す必要がありますN
__VA_ARGS__
上記のコード (を使用BOOST_PP_OVERLOAD
) では、不適切な結果が得られます。
これにより、
そして、私はこのようなものが欲しい:
- 望ましい結果を達成する方法を知っている人はいますか?
- ライブラリを使用して、一部を使用
Boost.preprocessor
して自動的に生成できますかMETADATA_METHODS_IMPL_K
K in [1 .. 10]
METADATA_METHODS_IMPL_1
c++ - Variadac マクロはすべての引数にマクロを適用します
私は C++11 バリアダック マクロを試していました。
リスト内の各引数に別のマクロを適用しようとしていました。
これは私の最初の試みです:
残念ながら、これはうまくいきませんでした。
私は最終的にそれを機能させました。しかし、それは少し複雑で、'n' という制限があります ('n' は、私がマクロを入力する最大サイズです)。
iterate
したがって、私の質問は次のとおりです。引数チェーンに沿って私を可能にする単純なものが欠けていますか?
c++ - この変数ダンプ デバッグ マクロを可変長に拡張するにはどうすればよいですか?
最初の作業コード:
stderr出力(gcc)を提供します:
ここで、任意の数の引数を持つ可変引数マクロを使用したいので、たとえば
DUMP(argc, argc+1);
次のような出力で機能します。
int main(int):8:argc='1',argc+1='2'
しかし、私はまだ良い解決策を思いつくことができませんでした. これはマクロでも可能ですか?そうでない場合は、テンプレート、またはマクロとテンプレートの組み合わせはどうですか? C++11 と Boost は必要に応じて問題ありません。また、標準的な方法がない場合、ソリューションはgcc固有のものになる可能性があります。可変個引数 DUMP を上記のように機能させるか、少なくとも同等の情報を表示する実際のコードを探します。
c++ - 可変個引数の引数を持たない可変個引数マクロ
可変個引数に引数を指定せずに可変個引数マクロを呼び出すことは合法M
ですか?
関連する標準引用符は[cpp.replace]/4です:
マクロ定義の識別子リストが省略記号で終わらない場合、関数のようなマクロの呼び出しにおける引数の数 (前処理トークンを含まない引数を含む) は、マクロ定義のパラメーターの数と等しくなければなりません。それ以外の場合、呼び出しには、マクロ定義のパラメーターよりも多くの引数が必要です ( を除く
...
)。)
呼び出しを終了する前処理トークンが存在する必要があります。
非可変長パラメーターがない場合M()
、呼び出しには 1 つの引数 (前処理トークンで構成されていない) があるため、フォーム内の呼び出しは正当である必要があります。したがって、非可変引数よりも引数が 1 つ多くなります。
非可変引数が 1 つの場合、可変引数の前処理トークンを含まない引数を導入するために末尾,
に as を付ける必要がありますか? M(1,)
それ以外の場合、引数の数は非可変引数の数と等しくなります。つまり、
ただし、 ClangとGCCはどちらも次のテスト ケースを受け入れます。
そして出力として生成します:
これは標準外の動作ですか?
c++ - C++ 可変個引数マクロとテンプレート
可変長マクロとテンプレートで遊んでいます。以下を達成する簡単な方法はありますか?
std::make_tuple のようなものです。make_my_class を実装するには? おそらく「std::decay」が必要だと思いましたが、よくわかりません。よろしくお願いします。