同じ「コールスタック」でマクロリストを2回使用するにはどうすればよいですか?

ジュリアス

次のようなマクロリストに情報が保存されています。

#define MYLIST(XX) \
  XX(1, hello)     \
  XX(2, world)     \
  ...

ここで、このマクロを同じ「呼び出しスタック」で2回使用したいと思います。これはばかげた例です:

#define BB(i,n) i +
#define AA(i,n) i + (MYLIST(BB) 0) +
int foo = MYLIST(AA) 0;

ただし、2回目MYLIST は拡張されないため、これは機能しません

int foo = 1 + (MYLIST(BB) 0) + 2 + (MYLIST(BB) 0) + 0;

MYLIST既存のリストを使用して、同じ「コールスタック」で2回使用する方法(または回避策)はありますか?

レイ

次のコードが機能します。

#define EVAL(...) __VA_ARGS__
#define EVAL2(...) EVAL(__VA_ARGS__)
#define EMPTY()
#define DELAYED_CALL(F, ...) F EMPTY()(__VA_ARGS__)

#define BB(i,n) i +
#define AA(i,n) i + (MYLIST(BB) 0) +

#define MYLIST(XX) \
    DELAYED_CALL(XX, 1, hello) \
    DELAYED_CALL(XX, 2, world)

int foo = EVAL2(MYLIST(AA)) 0;

出力: int foo = 1 + (1 + 2 + 0) + 2 + (1 + 2 + 0) + 0;

残念ながら、これが機能する理由を深く理解していませんこのような場合に役立つ傾向があるいくつかのトリックを試しました。しかし、私はそれのいくつかを説明することができます。

マクロに「これ以上展開しない」というフラグが立てられることがあります。フラグは通常、展開を開始すると設定され、展開が終了すると設定が解除されます。これは再帰を防ぐ傾向があります。

マクロが通常は関数のようなマクロ呼び出しであるトークンに展開されるとき、それらが展開されるフェーズをすでに通過している場合があります。

評価時に2番目のマクロを追加てマクロ呼び出し作成することにより、フラグが問題を引き起こさないポイントまでマクロの展開を遅らせることで、最初の問題を回避できます。それが何をするかDELAYED_CALLです。しかし、そうすることで、2番目の問題EVALが発生するため、マクロを再スキャンするためにいくつかの呼び出しを追加する必要があります(関数のようなマクロへの引数は常にスキャンされるため、トークンのシーケンスを関数に渡します-引数をエコーするだけのマクロのように、再スキャンが発生します)。

すべてを機能させるために、2、3回の再スキャンが必要になる場合があります。EVAL2(X)の省略形ですEVAL(EVAL(X))より多くの評価が必要になる場合があります。

以下のコードは、何が起こっているのかを少し明確にします。MYLIST2バージョンに必要なEVALが1つ少ないことに注意してください。これは、AAがMYLISTを呼び出し、MYLIST2が問題のフラグが設定されているためです。

#define EVAL(...) __VA_ARGS__
#define EVAL2(...) EVAL(__VA_ARGS__)
#define EVAL3(...) EVAL2(__VA_ARGS__)
#define EMPTY()
#define DELAYED_CALL(F, ...) F EMPTY()(__VA_ARGS__)

#define BB(i,n) i +
#define AA(i,n) i + (MYLIST(BB) 0) +

#define MYLIST(XX) \
    DELAYED_CALL(XX, 1, hello) \
    DELAYED_CALL(XX, 2, world)

#define MYLIST2(XX) \
    XX(1, hello) \
    XX(2, world)

% MYLIST
int foo = MYLIST(AA) 0;
int foo = EVAL(MYLIST(AA)) 0;
int foo = EVAL2(MYLIST(AA)) 0;

% MYLIST2
int foo = MYLIST2(AA) 0;
int foo = EVAL(MYLIST2(AA)) 0;
int foo = EVAL2(MYLIST2(AA)) 0;

これの出力は次のようになります。

% MYLIST
int foo = AA (1, hello) AA (2, world) 0;
int foo = 1 + (BB (1, hello) BB (2, world) 0) + 2 + (BB (1, hello) BB (2, world) 0) + 0;
int foo = 1 + (1 + 2 + 0) + 2 + (1 + 2 + 0) + 0;

% MYLIST2
int foo = 1 + (BB (1, hello) BB (2, world) 0) + 2 + (BB (1, hello) BB (2, world) 0) + 0;
int foo = 1 + (1 + 2 + 0) + 2 + (1 + 2 + 0) + 0;
int foo = 1 + (1 + 2 + 0) + 2 + (1 + 2 + 0) + 0;

(%記号は特別なものではありません。出力に表示されるコメントが必要で、前処理中にCスタイルのコメントが削除されます。)

さらに読む記事の著者は、これを私よりもはるかによく理解しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じスレッドで同じミューテックスを使用して2回ロックするにはどうすればよいですか?

分類Dev

WHERE句で同じリストを2回使用するにはどうすればよいですか?

分類Dev

コールバックで同じ「文字列」を2回使用したい場合、preg_replace_callbackを使用するにはどうすればよいですか?

分類Dev

同じリクエストを最大でn回許可するにはどうすればよいですか?

分類Dev

スクリープロットスケールを主成分と同じに設定するにはどうすればよいですか?

分類Dev

同じ2D配列で2つのコンストラクターを使用するにはどうすればよいですか?Java

分類Dev

同じネットワーク内の他のデバイスにも同じパブリックIPがある場合、パブリックIPを介してコンピューターのローカルホストにアクセスするにはどうすればよいですか?

分類Dev

同じコールバック関数を使用して複数の変数をトレースするにはどうすればよいですか?

分類Dev

ローカルマシンへのアクセスを許可し、同じローカルネットワーク内の他のマシンとリソースへのアクセスを制限するにはどうすればよいですか?

分類Dev

同じプロジェクト内の2つの異なるデータベーススキーマを使用してEntityFramework Coreの移行(コードを最初に)を整理するにはどうすればよいですか?

分類Dev

同じクラスの別のメソッドでコンストラクターの状態を更新するにはどうすればよいですか?

分類Dev

リッチテキストボックスの同じ行にセミコロンを配置するにはどうすればよいですか?

分類Dev

カスタマイズされたインデックスを使用して、同じPandasシリーズ列のさまざまな部分をさまざまな色でプロットするにはどうすればよいですか?

分類Dev

同じソリューション内の4.6.1プロジェクトからマルチターゲット.NETCoreクラスライブラリを参照するにはどうすればよいですか?

分類Dev

同じマクロを使用して異なるC ++コードベースを確認するにはどうすればよいですか?

分類Dev

同時PHPスクリプトが同じコードを同時に実行しないようにするにはどうすればよいですか?

分類Dev

C ++:同じスコープで並列forマクロを複数回使用するにはどうすればよいですか?

分類Dev

同じリストを空にせずに 2 回印刷するにはどうすればよいですか?

分類Dev

同じクラスを使用して、ターゲットごとに異なる機能を実行するにはどうすればよいですか?拡張機能とプロトコルは私を失敗させます

分類Dev

同じ選択を渡す/コピーするにはどうすればよいですか?シングルクリックで同じ選択範囲で複数のマクロを実行できるようにします。

分類Dev

同じコードフォーマットスタイルをWebStormとVSCodeに設定するにはどうすればよいですか?

分類Dev

Javaストリームが同じメソッドを2回実行しないようにするにはどうすればよいですか?

分類Dev

Pythonにスタックされた同じデコレータを使用するにはどうすればよいですか?

分類Dev

同じクラスの onLongClick メソッドの複数のボタンで OnLongClick リスナーを使用するにはどうすればよいですか

分類Dev

SSISデータフロータスクでファイルのフォーマットを使用するにはどうすればよいですか?

分類Dev

ボタンをx回クリックした後、divの一番下までスクロールするにはどうすればよいですか?

分類Dev

同じスタイル内のセッターを使用して、スタイル付きコントロール内の同じタイプの要素を異なる方法で変更するにはどうすればよいですか?

分類Dev

属性と変数のコンストラクターに同じデータを使用するにはどうすればよいですか?

分類Dev

コンピューターのクラスターがありますが、ntpdをセットアップして、すべてがほぼ同じクロックになるようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    同じスレッドで同じミューテックスを使用して2回ロックするにはどうすればよいですか?

  2. 2

    WHERE句で同じリストを2回使用するにはどうすればよいですか?

  3. 3

    コールバックで同じ「文字列」を2回使用したい場合、preg_replace_callbackを使用するにはどうすればよいですか?

  4. 4

    同じリクエストを最大でn回許可するにはどうすればよいですか?

  5. 5

    スクリープロットスケールを主成分と同じに設定するにはどうすればよいですか?

  6. 6

    同じ2D配列で2つのコンストラクターを使用するにはどうすればよいですか?Java

  7. 7

    同じネットワーク内の他のデバイスにも同じパブリックIPがある場合、パブリックIPを介してコンピューターのローカルホストにアクセスするにはどうすればよいですか?

  8. 8

    同じコールバック関数を使用して複数の変数をトレースするにはどうすればよいですか?

  9. 9

    ローカルマシンへのアクセスを許可し、同じローカルネットワーク内の他のマシンとリソースへのアクセスを制限するにはどうすればよいですか?

  10. 10

    同じプロジェクト内の2つの異なるデータベーススキーマを使用してEntityFramework Coreの移行(コードを最初に)を整理するにはどうすればよいですか?

  11. 11

    同じクラスの別のメソッドでコンストラクターの状態を更新するにはどうすればよいですか?

  12. 12

    リッチテキストボックスの同じ行にセミコロンを配置するにはどうすればよいですか?

  13. 13

    カスタマイズされたインデックスを使用して、同じPandasシリーズ列のさまざまな部分をさまざまな色でプロットするにはどうすればよいですか?

  14. 14

    同じソリューション内の4.6.1プロジェクトからマルチターゲット.NETCoreクラスライブラリを参照するにはどうすればよいですか?

  15. 15

    同じマクロを使用して異なるC ++コードベースを確認するにはどうすればよいですか?

  16. 16

    同時PHPスクリプトが同じコードを同時に実行しないようにするにはどうすればよいですか?

  17. 17

    C ++:同じスコープで並列forマクロを複数回使用するにはどうすればよいですか?

  18. 18

    同じリストを空にせずに 2 回印刷するにはどうすればよいですか?

  19. 19

    同じクラスを使用して、ターゲットごとに異なる機能を実行するにはどうすればよいですか?拡張機能とプロトコルは私を失敗させます

  20. 20

    同じ選択を渡す/コピーするにはどうすればよいですか?シングルクリックで同じ選択範囲で複数のマクロを実行できるようにします。

  21. 21

    同じコードフォーマットスタイルをWebStormとVSCodeに設定するにはどうすればよいですか?

  22. 22

    Javaストリームが同じメソッドを2回実行しないようにするにはどうすればよいですか?

  23. 23

    Pythonにスタックされた同じデコレータを使用するにはどうすればよいですか?

  24. 24

    同じクラスの onLongClick メソッドの複数のボタンで OnLongClick リスナーを使用するにはどうすればよいですか

  25. 25

    SSISデータフロータスクでファイルのフォーマットを使用するにはどうすればよいですか?

  26. 26

    ボタンをx回クリックした後、divの一番下までスクロールするにはどうすればよいですか?

  27. 27

    同じスタイル内のセッターを使用して、スタイル付きコントロール内の同じタイプの要素を異なる方法で変更するにはどうすればよいですか?

  28. 28

    属性と変数のコンストラクターに同じデータを使用するにはどうすればよいですか?

  29. 29

    コンピューターのクラスターがありますが、ntpdをセットアップして、すべてがほぼ同じクロックになるようにするにはどうすればよいですか?

ホットタグ

アーカイブ