最初のマクロを展開せずに、マクロを引数として別のマクロにフィードできますか?

ヴィンセント

背景:ここに投稿できない私のコードは、最終的にはマイクロコントローラーで実行されます。マクロは、1つのマクロ定義メカニズムを介して複数のピン定義関数を作成する方法を提供するだけです。私はwindowsとgccを使ってそれらを実験しています。

私は可能な限り問題を抽象化しようとしました。stdコンソール関数を使用しているので、コンソールウィンドウに表示すると便利です。そのため、ファイルを.cppとして保存し、Windowsでg ++を使用してコンパイルします。

次のようにコードを設定したとします。

#define MACRO2(_x)  foo##_x(_x)
#define MACRO1(_x)  MACRO2(_x)
#define BAR         3   

void fooBAR(int num)
{
    std::cout << num << std::endl;
}

次のコードを実行した場合(実際の例)

int main()
{
    MACRO2(BAR);
    return 0;
}

最初にBARが## _ xに挿入され、呼び出される関数名が定義されます。次に、BARがその関数の引数として挿入され、その値に展開されるため、fooBAR(3)が取得されます。コードは機能し、エラーはありません。

ここで、間にマクロを追加しようとすると(これは、私が入ることができない理由で直面している現実の状況です)、私のコードは次のようになります。

int main()
{
    MACRO1(BAR);
    return 0;
}

しかし、このコードはエラーをスローします。これは、MACRO1(BAR)がMACRO2(BAR)に置き換えられると、(BAR)が3に展開され、MACRO2(3)がfoo3(3)につながるためです。これは、によって確認されています。エラーログ:

エラー:「foo3」はこのスコープで宣言されていません

したがって、要件は次のとおりです。

  1. BARをMACRO1に渡す必要があり、展開せずにMACRO2に渡す必要があります
  2. BARという単語はそのままにしておく必要があります。展開を防ぐために##を使用できることはわかっていますが、BARに文字を追加する必要があり、関数呼び出しが機能しなくなります。

どういうわけかこれを成し遂げることは可能ですか?プロセスで最初のマクロを展開せずに、マクロを引数として別のマクロに渡しますか?

ジョン・ボリンジャー

ただし、このコードはエラーをスローします。これは、MACRO1(BAR)がMACRO2(BAR)に置き換えられると、(BAR)が3に展開され、MACRO2(3)がfoo3(3)につながるためです。

はい。これは、特定のマクロセットに対して指定されたプリプロセッサの動作です。

それらが識別された後、関数のようなマクロへの引数は、##または#プリプロセッサ演算子のオペランドである場合を除いて、マクロの置換テキストに置換される前に完全にマクロ展開されますこれらの演算子の出現が評価され、結果のテキストが、必要に応じて後続のテキストとともに再スキャンされ、追加のマクロが展開されます。

どういうわけかこれを成し遂げることは可能ですか?プロセスで最初のマクロを展開せずに、マクロを引数として別のマクロに渡しますか?

引数が##or#演算子のオペランドである場合のみ後者は役に立ちませんが、前者には回避策があります。必要な引数を変更せずに連結を実行できるように、追加の空の引数を渡すことができます。

#define MACRO2(_x)        foo##_x(_x)
#define MACRO1(_x,dummy)  MACRO2(_x##dummy)
#define BAR               3   

int main()
{
    MACRO1(BAR,);
    return 0;
}

それはに拡大します

int main()
{
    fooBAR(3);
    return 0;
}

余分なコンマを避けたい場合は、MACRO1可変個引数を作成することでそれを行うことができます

#define MACRO2(_x)      foo##_x(_x)
#define MACRO1(_x,...)  MACRO2(_x##__VA_ARGS__)
#define BAR             3   

int main()
{
    MACRO1(BAR);
    return 0;
}

それは他のものと同じものに拡大します。

これらのアプローチはどちらも、最上位のマクロに不要な追加の引数値を提供することにより、エラーが発生する可能性があることに注意してください。おそらく、このようなエラーのほとんどはコンパイル時にキャッチされると思われます。これは、拡張によって、質問の試みのようにコードが壊れてしまうためです。しかし、そのようなエラーが偶然に有効であるが間違っているものに拡大する可能性を排除することは困難です。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

別のマクロに引数として渡される前にC ++マクロを展開する方法

分類Dev

Excel VBAで個別のマクロを必要とせずに、ボタンからマクロコードを割り当て/実行します

分類Dev

引数が欠落している場合にマクロを別のデフォルトマクロに展開する

分類Dev

cppcheckはCコードをチェックするときにマクロを展開しませんか?

分類Dev

CircleCIを使用してマスターにマージを開発するために別のワークフローを実行できますか?

分類Dev

可変個引数マクロに基づいて複数のマクロを展開する方法

分類Dev

Xマクロを別のマクロ内で展開する

分類Dev

スライスパターンを使用して、クローンを作成せずにコマンドライン引数を解析できますか?

分類Dev

マクロ関数を引数として別のマクロ関数に渡す

分類Dev

[ファンシー]マクロを展開しているときにavr-gccが引数の欠落について教えてくれるのはなぜですか?

分類Dev

マクロを書いたファイルを開かずに、Excelファイルでマクロ付きのボタンを機能させます

分類Dev

Cマクロのいくつかの引数を別のマクロとして定義するにはどうすればよいですか?

分類Dev

マクロを構造体フィールドに展開することは可能ですか?

分類Dev

マクロ展開でこのループのセマンティクスを取得できません

分類Dev

マクロ展開の時点で識別子が字句的にバインドされているかどうかを確認しますか?

分類Dev

マクロシートを再度開かずに、複数のブックを使用してハイパーリンクからマクロを呼び出す

分類Dev

Cはマクロトークンを引数としてどのように認識しますか

分類Dev

物事を直接渡すのではなく、マクロを別のマクロに渡すときに、不要な余分な「空の」引数が表示されます

分類Dev

コマンドラインFFMPEGを実行して、最初の入力をブロックせずに複数のパイプ(ビデオとオーディオ)を受け入れるにはどうすればよいですか?

分類Dev

引数の数に対応する文字を含むフォーマット文字列に展開する可変個引数マクロラッパー

分類Dev

evalを使用せずにこのマクロを作成できますか?

分類Dev

マクロ内のstatic_assertだけでなく、関数パラメーターとして使用できるものに展開します

分類Dev

関数のようなマクロを展開すると、別のトークンが作成されます

分類Dev

rustc --pretty Expandedは、externブロック内のマクロ展開を解析するときにすべてのRAMを使用します

分類Dev

新しいアプリケーションでテストを実行するときのScalaエラー。マクロを展開できませんか?

分類Dev

Android Studioのフォーマットについて、FlutterプロジェクトでDartコードを展開します

分類Dev

マクロを展開するときにユーザー定義の関数を使用することは可能ですか?

分類Dev

(C99)別のマクロでマクロを展開する

分類Dev

マクロ展開の末尾のコンマを削除します

Related 関連記事

  1. 1

    別のマクロに引数として渡される前にC ++マクロを展開する方法

  2. 2

    Excel VBAで個別のマクロを必要とせずに、ボタンからマクロコードを割り当て/実行します

  3. 3

    引数が欠落している場合にマクロを別のデフォルトマクロに展開する

  4. 4

    cppcheckはCコードをチェックするときにマクロを展開しませんか?

  5. 5

    CircleCIを使用してマスターにマージを開発するために別のワークフローを実行できますか?

  6. 6

    可変個引数マクロに基づいて複数のマクロを展開する方法

  7. 7

    Xマクロを別のマクロ内で展開する

  8. 8

    スライスパターンを使用して、クローンを作成せずにコマンドライン引数を解析できますか?

  9. 9

    マクロ関数を引数として別のマクロ関数に渡す

  10. 10

    [ファンシー]マクロを展開しているときにavr-gccが引数の欠落について教えてくれるのはなぜですか?

  11. 11

    マクロを書いたファイルを開かずに、Excelファイルでマクロ付きのボタンを機能させます

  12. 12

    Cマクロのいくつかの引数を別のマクロとして定義するにはどうすればよいですか?

  13. 13

    マクロを構造体フィールドに展開することは可能ですか?

  14. 14

    マクロ展開でこのループのセマンティクスを取得できません

  15. 15

    マクロ展開の時点で識別子が字句的にバインドされているかどうかを確認しますか?

  16. 16

    マクロシートを再度開かずに、複数のブックを使用してハイパーリンクからマクロを呼び出す

  17. 17

    Cはマクロトークンを引数としてどのように認識しますか

  18. 18

    物事を直接渡すのではなく、マクロを別のマクロに渡すときに、不要な余分な「空の」引数が表示されます

  19. 19

    コマンドラインFFMPEGを実行して、最初の入力をブロックせずに複数のパイプ(ビデオとオーディオ)を受け入れるにはどうすればよいですか?

  20. 20

    引数の数に対応する文字を含むフォーマット文字列に展開する可変個引数マクロラッパー

  21. 21

    evalを使用せずにこのマクロを作成できますか?

  22. 22

    マクロ内のstatic_assertだけでなく、関数パラメーターとして使用できるものに展開します

  23. 23

    関数のようなマクロを展開すると、別のトークンが作成されます

  24. 24

    rustc --pretty Expandedは、externブロック内のマクロ展開を解析するときにすべてのRAMを使用します

  25. 25

    新しいアプリケーションでテストを実行するときのScalaエラー。マクロを展開できませんか?

  26. 26

    Android Studioのフォーマットについて、FlutterプロジェクトでDartコードを展開します

  27. 27

    マクロを展開するときにユーザー定義の関数を使用することは可能ですか?

  28. 28

    (C99)別のマクロでマクロを展開する

  29. 29

    マクロ展開の末尾のコンマを削除します

ホットタグ

アーカイブ