問題タブ [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 - C引数の合計サイズを計算する関数
現在、関数に渡される引数の合計サイズをバイト単位で計算しようとしています。sizeof(x)
理論的には、すべての引数について書き出すことができます。ただし、多くの機能でこれを実行したい場合、これは非常に時間の無駄です。引数のスペースの量を把握して、適切な量のメモリを割り当ててすべてを格納し、格納できるようにしようとしています(さまざまな関数の場合、タイプが混在しています)。
名前や数に関係なく、非可変個引数関数のすべての引数のサイズを決定できる式を作成しようとしています(理由の範囲内で、今のところ約64個の引数のみをサポートしても問題ありません)。 )。それは関数、プリプロセッサマクロである可能性があり、私は実装にとらわれません。可変個引数関数の処理にも興味がありますが、可変個引数関数に入るまでにデータ型に関するすべての情報が失われているため、それは不可能だと確信しています。
現在、私はこれを可能にするためにねじれるかもしれない3つのアプローチを見つけました。1つ目は、 LaurentDeniauの引数カウントの概念に基づいています。理論的には、マクロを使用して関数ヘッダーを生成し、同様の凝ったフットワークを実行して、引数の数を取得し、N個の引数がある個々のケースを処理するさまざまなマクロにディスパッチできます。(参照:醜い)。基本的には、マクロを使用してすべての関数名をエイリアスし、それぞれにsizeofを使用します。問題は、表現したいすべての長さの引数に対してマクロを作成する必要があるということです。そして、私は1つの仕事をするために64(またはそれ以上)のものを作ることを本当に好まない。
2番目のアプローチは、BenKlemerの「より優れた可変個引数」のもののアプローチに従うことを試みることです。私は彼のアプローチのすべてを使用するわけではありませんが、関数のargシグニチャを構造体に表す構造体を生成しようとしています。次に、構造要素のサイズを取得することを試みることができます(または、スペースの控えめな見積もりだけを気にした場合は、構造自体も)。これにはいくつかの問題があります。まず、C99準拠のものでのみ機能する可能性があります(まだそれをチェックしています)。次に、実装されるすべての関数に追加の構造を作成します。これは完全に問題ではありませんが、構造体を作成する彼のアプローチが関数と同じ名前になるという問題があります(したがって、それらを使用するには名前を参照する必要があります)。
可能な3番目のアプローチは再帰マクロですが、それがコンパイラーをどれほど満足させるかはわかりません。理論的には、形式でマクロを呼び出すことにより、 VA_ARGSから要素を再帰的にポップすることができます。明らかに、 VA_ARGが空の場合の停止ルール(およびフローティング+記号に引っ掛からないようにするための何か)が必要ですが、あなたはその考えを理解します。POPPER(arg, ...) POPPER(VA_ARGS) + sizeof(arg)
これらのいずれかを使用すると、これを実行できます。
- 可変個引数マクロからVA_ARGSを解凍するための優れた柔軟な方法。インデックスを作成する方法がある場合
- これを行うために信頼できる再帰マクロの良い例(および引数の最大数、コンパイラの互換性、標準への準拠などの制限)。
- さまざまなタイプの関数検査を通じて、すべての引数の合計サイズを直接取得する方法。GCCには、適用可能なコール転送の関数呼び出しを作成するためのいくつかのクレイジーな関数があるようですが、これらはコンパイラ固有であり、ほとんど文書化されておらず、割り当てられたメモリブロックのサイズを報告していないようです。彼らはまた、無関係な情報を大量に報告します。
c++ - 可変長マクロ
次のようなマクロを記述する方法はありますか。
それとも、個人ごとにこれを定義する必要がありますn
か?
C++0x の回答は問題ありません。
編集:一般的に可変数の引数をとるマクロではなく、この形式のマクロを作成する方法を尋ねています。
目標: : だから私は次のようなことをすることができます:
したがって、これmytuple
は、移動やコピーを行わずに作成することも、集約構築を使用してその場で作成できた可能性のある一時ファイルへの不要な参照を作成することもできません。
c++ - 非可変個の printf スタイルのロガー
私たちの C/C++ プロジェクトは、Python スクリプトで利用できるようにするために SWIG のすべての関数を自由にラップする新しい内部スクリプトを使用しています。SWIG は可変個引数関数を適切にラップできないため、ロガー関数が詰まります。
そこで、SWIG がつまずくことのないマクロで可変個引数機能を非表示にすることにしました。以下の簡単な例をご覧ください。
これでいいですか?この問題に対するより良い解決策はありますか? ありがとう。
visual-c++ - Visual C++ で空の __VA_ARGS__ を使用してカンマを削除できないようにすることはできますか?
Visual Studio 2005 では、次のようなマクロがあります (例示!!):
関数が少なくとも 1 つの引数を取る限り、問題ありません。
関数が引数を取らない場合、プリプロセッサは「役立つように」「末尾のコンマ」を削除し、次のように展開します。
いいですね。
__VA_ARGS__
Visual C++ (VS 2005)でゼロで動作するように、このマクロを修正するにはどうすればよいですか?
どうやらこれは VS2005 のバグです。
variadic-functions - 可変個引数マクロを可変個引数テンプレート関数に変換しますか?
次の形式の可変個引数マクロを指定します。
-これを可変個引数関数テンプレートに書き直すにはどうすればよいですか?
Args
更新::&&
またはまたは何の参照タイプを宣言する方法に特に興味がありますconst&
か?
更新:FTypeは「プレーンな」関数ポインターであると想定されていることに注意してください。
c - マルチレベルマクロ呼び出しでのマクロ引数の文字列化
私はこのようなマクロを持っています:
できます:
これは期待どおりに印刷FOO+BAR=579
されます。
ここで、SHOW_EXPRを呼び出すマクロを定義しようとしています。
Look ma, 123+BAR=579
これも期待通りに印刷されますが、これは私が望んでいることではありません。
正しいことをするようにMY_SHOW_EXPRを定義することは可能ですか?
(実際のマクロは、ここに示されているよりも少し複雑です。マクロが悪であることはわかっています。)
c++ - 可変個引数マクロの 2 つの異なる構文
それらの間に機能的な違いはありますか?(つまり、特定のケースでは、そのうちの 1 つを他のものよりも適切に使用できます)。また、両方の構文が C++11 に含まれていますか?
c++ - MSVC++可変個引数マクロ展開
そのため、GCCではうまく機能するマクロがありますが、MicrosoftのC++コンパイラでは機能しません。誰かが回避策を知っているか、おそらくそれがこのように動作する理由を私に説明できることを願っています。
このマクロは正確に「標準」ではないと確信していますが、それは本当に役に立ちます。
マクロの機能例を次に示します。
このマクロの使用方法は次のとおりです。
GCCが上記を拡張する方法は次のとおりです。
しかし、Microsoftは何らかの理由で、私のすべての__VA_ARGS__を1つの引数として拡張しています。
なぜこれなのか誰か知っていますか?MicrosoftにGCCのようにこれを拡張させるために私が引っ張ることができるいくつかのトリックはありますか?たぶん、括弧のいくつかの余分なペアを投げますか?
このようなマクロは、大量の「グルー」コードを置き換えるのに非常に役立ちますが、この問題のため、VSプロジェクトに移動できません。どんな助けでも大歓迎です!
ありがとう。
c++ - C/C++ コードをクリーンアップすると、可変個引数マクロの問題が明らかになります
C、C++、および Java のコード ベースで、コードのクリーンアップ、符号付き/符号なし比較の修正、静的解析の実行などを行っています。
私たちが受け取っている警告の1つは
そして、その仲間の警告
さて、C コードではC99 標準の可変引数マクロを使って問題を解決しましたが、C++ コードでは何が正解なのでしょうか? 同じ C99 スタイルを使用すると、異なる警告が表示されます
答えがわかりません。
Linux で GCC (G++) 4.4.3 を使用しています。
コードの特定のセクションでそれを修正または無効にすることができるフラグまたはその他の方法があることを願っていますが、ほとんどすべてのファイルで使用されるログのためです...
c - マクロ化されたパラメータ
多くのパラメータセットが「マクロ化」されたシステム(「#definename value、value、value」の形式のマクロ)があります。これらをマクロに渡したいのですが、エラーが発生します。
例:
Visual CIで取得: