問題タブ [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++ - マクロ パラメーターのシーケンスを別のマクロに変換する
定義が MACRO(name, seq) のようで、コードが次のような場合、マクロの各要素にアクセスする方法:
次のコードを生成したい:
またはそのようなもの。つまり、すべてのパラメーターを個別に処理したい (定義は気にしません。
より多くの要素が存在する可能性があり、より少ない可能性があります。私は試し__V_ARGS__
ました(gccでのみ必要です)が、すべての要素を個別に処理するのではなく、それによってコピーすることしかできません。
私に何ができる?
PS 諸事情によりBoostが使えません。
c++ - コンマを含む文字列を文字列化する方法は?
コンパイル コマンドでバージョン文字列を渡したい:
私のコード内には、次のものがあります。
マクロにコンマが含まれているため、これは機能しません。つまり、VERSION
2 つの引数を に渡しているように見えますTOSTR()
(明らかに、マクロは1 つの一意の引数としてVERSION
渡された後にのみ展開されます)。STRINGIFY()
ここで見つけた次のアプローチも機能しません。
これは
つまり、マクロCONCAT()
は展開されません。
注 1:バージョン文字列は実際には動的に生成され、引用符が含まれている可能性があるため、コマンド ラインでC文字列を渡したくありません。これはg++ -D VERSION=\""$(GENERATED_STRING)"\"
、渡された引数を文字列化する代わりに単に書くだけでは機能しないことを意味します。
注 2: プリプロセッサ マクロをまったく使用せずにこれを行う方法を誰かが見つけた場合、私は非常に嬉しく思います。
c - 可変長マクロと関数を使用する場合の「スタック割り当てによって初期化されていない値が作成されました」
次のプログラムがありますhttp://ideone.com/1RPs8E。ログ ファイルに行を出力する可変長関数 tlog を使用します。出力される行のレベル、ファイル名、デバッグ情報の行と関数、および printf の形式と引数のリストを受け取ります。
現在のファイル、行、および関数に対して tlog 関数を呼び出す LOGL マクロも使用します。
たとえば、LOGL マクロを使用するさまざまなマクロ:
valgrind でプログラムを実行する場合:
次のエラーが表示されます: 150 行目 (DEBUGEX マクロを使用した場合) に「スタック割り当てによって初期化されていない値が作成されました」。完全なログはこちら: http://pastebin.com/rZu4nkHd
コードの問題は何ですか?私にとっては大丈夫のようです。tlog 関数とそれを呼び出すすべてのマクロから level パラメータを削除すると、エラーは発生しなくなります。
Archlinux では gcc 4.8.2、Ubuntu 12.04.3 では gcc 4.6.3 でテスト済み
c - Cの可変引数マクロで引数が渡されたかどうかを確認する
よりクリーンなエラー処理のために、マクロを使用します (C99 および GCC 拡張機能を使用します)。動作は標準のようassert
です:
say
フォーマットされた出力です。そして、そのように使用します:
具体的なエラー メッセージがない場合は、 と書く必要がありますA(cond, 0)
。A(cond)
しかし、この場合は書きたいだけです。A
この動作のためにマクロを変更するにはどうすればよいですか? msg
つまり、引数がマクロに渡されていないかどうかを確認する方法が必要です。
c - 可変長マクロと末尾のカンマ
私は C でオブジェクト指向を行おうとしていますが、表記法に構文糖マクロが必要です
の中へ
残念ながら、メソッドが引数を取らない場合、末尾のコンマの問題が発生します
与える
これを行う移植可能な(いいえ##__VA_ARGS__
または Visual Studio) 方法はありますか?
1つ見つけましたが、オブジェクトとメソッドを交換する必要があります
許可する
編集
以下からの2つの良い答えの助けを借りて、これらのマクロでそれを行います. 最大 16 個の引数で動作しますが、簡単に拡張できます
c - 可変個引数と後期展開を使用して文字列化されたマクロ引数のリストを作成する
次の問題があります-可変数のマクロ引数argXを指定して、文字列化された引数#argXのリストを作成します
例:
私は Boost を使用しているので、上記のマクロは、引数の数ごとにヘルパー マクロを使用して実装し、LIST(...) を適切な LIST_n(arg1, ... argn) にディスパッチするのはそれほど難しくありません。
問題は、LIST への入力自体がマクロである場合に始まります。その場合 (... と __VA_ARGS__ を使用すると)、マクロは文字列化される前に展開され、次のようになります。
Windowsヘッダーで定義されたマクロでこれを機能させたいのですが、そこにある値のほとんどはマクロ(MB_OK、AF_INETなど)であるため、取得するのは文字列化された数値のリストだけです。
__VA_ARGS__ を使用しない場合、すべて正常に動作します。
__VA_ARGS__ の展開を後で延期するいくつかのマクロを試しました (たとえば、可変引数のない LIST_1 まで) が、何も機能しませんでした。
これは、C プリプロセッサを使用して実装することも可能ですか?
c++ - 可変個引数マクロを使用して配列を生成する
可変個引数マクロを使用して、関数ポインターの配列を生成したいと考えています。これが例です。
前処理前:
前処理後:
これは可能ですか?
基本的に、配列展開の前に何か、配列展開の後に何かが必要であり、展開されたすべての可変長マクロ引数に接頭辞を追加する必要があります。