0

アイデアは、指定されたプレフィックスと番号に基づいて変数へのポインターを貼り付ける自動キャスターを作成することです。継続的に開発されているインターフェースがあり、数週間ごとにいくつかの新しい構造バージョンを取得するとしましょう。したがって、「(structure1*)、(structure2*)」などを明示的に記述する代わりに、SOME_DEFINE(thisStructure, version); を使用できます。ケースを処理する

私はこれがトリックを行うだろうと思った

#define d1(x) x
#define d2(x,y) x##y

void someFunction()
{
    int temp = 3;
    d2(myStructure,d1(temp)) *thisStruct;
}

私は、プリプロセッサがそれ自体をネストし、最初に d1 操作を貼り付けてから、d1 操作の結果を最初の d2 引数とマージすることを望んでいました。しかし、それはうまくいかないので、私の質問は、どうすればこの原因を達成できるかということです。

4

2 に答える 2

5

何をしようとしているのか正確にはわかりませんが、ここでの通常の問題は、プリプロセッサが引数内でマクロ置換を行う前に、トークンの貼り付けと文字列化を行うことです。したがって、次のようなものを書く場合:

#define PASTE(a,b) a ## b

そしてそれを呼びます:

#define x 123
PASTE(A,x)

、最後の行はに展開されますがAx、には展開されませんA123。望ましい結果を得るには、多くの場合、間接参照のレベルを追加する必要があります。

#define PASTEHELPER(a,b) a ## b
#define PASTE(a,b) PASTEHELPER(a,b)

これが機能するのは、toの引数の完全なマクロ展開が展開さPASTEれる前に行われるPASTEHELPERためです。したがってPASTE(A,x)、上記のでは、toの引数はandPASTEHELPERになります。A123

于 2012-11-16T08:55:33.360 に答える