問題タブ [boost-preprocessor]
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++ - Boost.Preprocessor で 2 次元シーケンスは可能ですか?
Boost.PP シーケンスは 256 要素に制限されています。これを回避するには、次のように定義される 2 次元シーケンスまたはシーケンスのシーケンスを使用します。
のようなアルゴリズムを提供するためにBOOST_PP_SEQ_FOR
、次のように 2 つのアルゴリズムをネストします。
2 つ目では、宣言されていない識別子に関する複数のエラーが発生しています。
エラー C2065: 'ELEM_ID_OP': 宣言されていない識別子
エラー C2065: 'MYFUNC': 宣言されていない識別子
エラー C2065: 'zero': 宣言されていない識別子
エラー C2065: 'one': 宣言されていない識別子
エラー C2065: 'two': 宣言されていない識別子
これは、コンパイラの最大再帰深度に達したため、マクロが展開されなくなったことを意味しELEM_ID_OP
ますMYFUNC
か? または、これが機能しないようにする Boost.PP の実装の詳細はありますか? これに対する回避策はありますか?
それが役立つ場合、私はVC++ 2013を使用しています。
c++ - Boost プリプロセッサ: 一連のタプルの要素にアクセスする
いくつかのログ機能を生成するブースト プリプロセッサ マクロを作成しようとしています。私は現在、単純なシーケンスで動作する実際の例を持っています(つまりFUNC( (a)(b)(c)(d) )
.)
タプルのシーケンスを使用するようにコードを変更すると ( に似ていBOOST_FUSION_ADAPT_STRUCT
ます)、マクロ展開は失敗します。
これは、要素が「タプル」になり、マクロ BOOST_PP_SEQ_FOR_EACH
が正しく展開されないためだと理解しています。
私はプリプロセッサのメタプログラミングが初めてで、必要なデータを正しく展開/抽出するために何を使用すればよいかわかりません。
c++ - プリプロセッサを使用して列挙型のサイズを取得する
列挙型の末尾に「COUNT」要素を追加する以外に、列挙型の長さを計算する方法を見つけようとしています。次のようにプリプロセッサを使用する方法を見つけました。
ただし、my_enum2
上記のように作成しようとすると、次のようにコンパイラ (CygWin の GCC 4.8.3) から再宣言エラーが発生します。
問題のある行を次のように変更すると、問題MAKE_ENUM(my_enum2, e)
なくコンパイルされます。ここで何が間違っているのか、どうすれば修正できるのでしょうか? 前もって感謝します!
c++ - Boost Preprocessor の反復制限
比較関数に Boost::Test フレームワークを使用して単体テストを作成しています。テスト ケースごとに、一連の入力要素を作成し、それらをペアごとに比較して、各ペアの比較関数の戻り値を確認します。手動で書き出すか、関数を書くことができます。関数を書くことは単体テストには適していません。なぜなら、失敗したときに得られる情報が少なくなるためです。各チェックを手動で書き出すと、単体テストが非常に長くなります。そこで、チェックする要素を繰り返し処理するためにマクロを使用することにしました。次のようになります。
部分的な順序付けではなく全体的な順序付けのテスト ケースではCHECK_NODE_LESS
、適切な要素に対してマクロを使用して、順序付けられた要素をチェックしましたが、正常に動作しました。全順序付けのテスト ケースでは、CHECK_NODE_ORDER
マクロを使用します。例えば:
現在、これはコンパイルされません。最初にテストしたのは、マクロをコメント アウトしCHECK_NODE_LESS
、プリプロセッサを実行して何が生成されるかを確認することです。それは私が期待していたものでした:CHECK_NODE_LESS
正しい要素のために呼び出されました. 次にCHECK_NODE_LESS
、プリプロセッサを再導入して実行し、何が起こるかを確認しました。ブースト テストで使用したマクロのせいで結果は非常に醜いものでしたが、一部のマクロが展開されていないことがわかりました。
最後にCHECK_NODE_LESS
、次のように変更したところ、正常に動作するようになりました。
BOOST_CHECK_EQUAL
問題は、Boost Preprocessor ライブラリに他のマクロと一緒に使用するときに超過する反復制限があるか、コンパイラにプリプロセッサの深さの制限があることだと思います (私は Clang 3.4 を使用しています)。この制限とは何ですか?どうすればそれを増やすことができますか?
c++ - プリプロセッサ マクロの一部として、C++ 列挙型定義のメンバーを返す関数を定義しますか?
次のように定義された列挙が与えられた場合:
DEFINE_ENUM() マクロの一部として定義され、列挙のすべてのメンバーを含むベクトルを返す関数を定義するにはどうすればよいですか?
以下は、上記のマクロ定義の最後に追加されたもので、これまでのところほぼ同じです。
ただし、これは無効に終了したマクロ定義を報告しており、それを含むファイルが複数のファイルに含まれている場合、すべての DEFINE_ENUM() の MemberOf() が複数定義されていると主張しています。
c++ - Boost プリプロセッサを使用して文字列を展開する方法
長さ不明の文字列を Boost のプリプロセッサ ライブラリで展開したい。
たとえば、私はこれが欲しい:
私のマクロでこれに展開するには:
foo[0]、foo[1]、foo[2]、'\0'
これが私のコードです。これは主にhereからコピーしたものです。
このまま使ってもいいですか?
c++ - Boost 1.55 から 1.57 への変更後、Boost プリプロセッサ プログラムがコンパイルされない
クラスの関数を生成するためのプリプロセッサ ディレクティブをいくつか作成しました。Boost 1.55 では、すべて正常に動作します。Boost 1.57 に変更しようとすると、奇妙なコンパイル エラーが発生します。
プログラムは次のとおりです。
gcc 4.9.1 では、次の出力が得られます。
clang 3.5.0 は私に言います:
Boost 1.57 に変更した後の問題を知っている人はいますか?
c++ - マクロベースのカウンター
次のようなコンパイル時定数を作成することは可能ですか:
どこSOME_EVENT
が0にSOME_OTHER_EVENT
なり、1になります。
次のコードを試しました:
ただし、eats 定数宣言を含めます。
c++ - 各要素を式で可変引数マクロにラップします
問題:
私は可変個引数マクロを書きたいと思っています
これは、トークンと N 個の引数で呼び出された場合
トークンにラップされた引数のコンマ区切りリストに展開されます
これにより、次のようなものを書くことができます。
次のように呼び出すと:
次のようになります。
これを達成する方法がわかりません。出来ますか?おそらく、BOOST_PP
またはそのようなものでしょうか?
動機:
ログ用のマクロがあります:
引数が提供されたフォーマット文字列と一致することを確認できる可変個引数クラス テンプレートがあります。
固定数の引数でマクロを定義すると、フォーマット チェック関数を呼び出すことができます。
ただし、可変引数マクロを使用すると、これは複数の引数に対しては機能しません。
これdecltype(__VA_ARGS__)
は、明らかに無効な構文であるためです。
それを修正するには、展開する必要があり__VA_ARGS__
ますdecltype(a1), decltype(a2), decltype(a3)
可変関数テンプレート?
constexpr
可変引数関数テンプレートを使用してこれを達成しようとしましたが、この時点で文字列リテラルではなくなったためfmt
、 a に渡すことができません。static_assert
このチェック関数を呼び出そうとしています
コンパイルに失敗します:
c++ - BOOST_PP 空のシーケンス ケースでシーケンスを展開します。
I を使用BOOST_PP
すると、次のコードに示すように、追加のトークンを使用してマクロを複数のコンマ区切りの値に展開できます。
ただし、引数がない場合は機能しません。
でコンパイルしたときの出力gcc -E main.cpp
は
MACRO
引数なし__VA_ARGS__
でnullに展開する呼び出しを取得するにはどうすればよいですか?
つまり、出力を次のようにしたいと思います。
どうすればこれを達成できますか?