問題タブ [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 に答える
753 参照

c++ - GCC でプリプロセッサ VARIADIC MACROS をだます

静的ライブラリをより安全にする作業が行われています。そのためにprintfは、コンパイルされた静的ライブラリで異なるように表示されるように、書式設定された文字列を置き換える必要があります。これを行うには、プリプロセッサで行う必要があります。ステージ。

私がやったこと(そしてそれは実際にビジュアルスタジオで動作します)は次のとおりです(そしてそれは単なる疑似例です):

このオーバーヘッドはすべて、文字列以外の引数なしで印刷を受け入れるようにコンパイラをだますためのものです

したがって、main.cでテストするときに、次のことを試してみましたが、うまくいきました:

しかし、GCC に切り替えたとき、彼は最初の出力の形式が気に入らなかった、つまり:

そして私にコンパイルエラーをスローします:

コンパイラをだまして受け入れる方法はありますか?または、コンパイル後に文字列の名前を安全に変更する方法のより良いアイデアですか?

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

c++ - `gnu-zero-variadic-macro-arguments` は無視しても安全ですか?

次のコードを考えてみましょう(実際の例) :


clang++ 3.4は文句を言います:


プロジェクトのサンプル コードのように、いくつかの可変長マクロを使用します。

...可変個引数マクロのパラメーターに引数を渡さないのは安全ですか? (基本的に警告無視)

それとも問題を引き起こす可能性がありますか?

標準で明示的に禁止されていますか?

0 投票する
3 に答える
3425 参照

ios - Objective C - #define using __VA_ARGS__

マクロの使い方を学んでいますが、今はマクロと混同しています。

NSStringすべてのパラメーターを互いに追加するだけの連結を作成しようとしています。

たとえば、次を含むものconcatOP(@"hey",@"Jude",@"Don't")を返します:NSString@"heyJudeDon't"

私は実際にパラメータの数を取得するコードを少し作成しましたが(ここにもいくつかあります)、ジョブの2番目の部分を作成できませんでした。

実際には多くのエラーが発生し、形式が存在しないか、「;」が欠落しているとのことです。または他の終了タグ。

0 投票する
3 に答える
191 参照

c - 可変引数の型安全性を保証するにはどうすればよいですか?

C では、次のような関数またはマクロを作成したいと考えています。

... は const char* のキーと値のペアでなければなりません。これに従わないコードがコンパイル時に爆発することを本当に望んでいます。これを行う __attribute((..)) ディレクティブを探してみましたが、役に立ちませんでした。何か案は?

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

c - 引数を可変個引数マクロに渡す

現在のところ、このマクロは可変長である必要はありません。しかし、将来の使用のために、可変長にしたいと思います。可変引数マクロの引数リストの書き方・定義方法と使い方がわかりません。上記の例のように、p1、p2 を設定して印刷する必要があります。

このマクロを次のように呼び出しています。

誰かがこれを可変的な方法で達成するのを手伝ってくれませんか?

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

c++11 - 可変引数マクロを使用して多重継承を宣言することは可能ですか?

私は、コンパイル時の仕組みに大きく依存するメッセージング システムを作成しました。メッセージを受信するには、次のようにクラス テンプレートから継承します。

マクロを使って、この表記をきちんと短縮する方法があるのではないかと考えていました。上記のマクロが使用されると私が想像する方法:

そのような FEA_IS_RECEIVER マクロを作成する方法はありますか?

可変引数マクロを調べましたが、特定の量のパラメーターごとに特定のマクロ オーバーロードを記述しない限り、それらを評価することはできないようです。このアプローチは機能しますが、サブスクライブできるメッセージの量が制限されます。

私がやろうとしていることを達成するためのきちんとした方法はありますか?

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

c - C マクロの引数の有無を検出する

追加の引数なしで呼び出すと が生成され、 1 つまたは複数の引数を指定して呼び出すと が生成さIFARGS(YES, NO, ...)れるように C マクロを定義するにはどうすればよいでしょうか?IFARGSNOIFARGSYES

GCC を使用した回答がありますが (以下を参照)、可能であれば C99 (またはその不可能性の証明) を使用したいと思います。

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

c++ - マクロ内でのマクロ展開

LOGDEBUG マクロを作成しようとしています:

引数を文字列化するために # または ## パラメーターを使用していませんが、g++ は明らかにそれらを文字列化しようとします。

であることに注意してください。マクロでhaystack_lensize_t変換しませんがchar*、コンパイラはそれをそのように認識します。g++ は暗黙的にマクロ引数を文字列に変換しようとしますか?

それを修正する方法は?つまり、syslog に gnu LOG_MAKEPRI マクロを使用しているのですが、このマクロが問題を引き起こしているのでしょうか? また、マクロ展開されたコードを見る方法はありますか?

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

c++ - Visual Studio __VA_ARGS__ の問題

cl /P test.cpp を実行すると、ファイルと結果は次のようになります。

test.cpp

Cl /P test.cpp :

__PRETTY_FUNCTION__結果の最後の引数として が置かれるのはなぜだろうか。結果は次のようになるはずです。

VS 2010 のバグですか?

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

c - 複数の配列の割り当てを解除するC99の可変関数?

現在、プログラムで double の配列を解放するための非常に単純な関数があります。

いくつかの配列を取り、それらを次々に解放するために、この関数を可変長にしたいと思います。私は可変引数関数を書いたことがありません。ポインターを使用したトリックが存在する可能性があるため、その方法を知りたいです。