1

マクロから展開されたテキストを取得する方法は?

#include <stdio.h>

#define paste(front, back) front ## back

int main()
{
    int number1 = 23;
    int number2 = 64;

    printf("%d\n", paste(number, 2));


    return 0;
}

マクロが次のように展開されるため、出力は64です。

printf("%d\n", number2);

定義された貼り付けマクロを使用して、識別子 number2 を文字列として出力するにはどうすればよいですか。出力を作成する方法を知る必要があります: number2: 64直接「number2」と書かないことで、この解決策は必要ありません:

printf("number2: %d\n", paste(number, 2))

動的なソリューションが必要です。私は次のようにして連結しようとします:

printf("%s: %d\n", paste(number, 2), paste(number, 2));

しかし、貼り付けマクロによって返される number2 は整数の識別子であるため、機能しません。テキスト (文字列) として取得するにはどうすればよいですか?

4

2 に答える 2

2

文字列化ディレクティブを使用します#:

#define stringize_impl(x) #x
#define stringize(x) stringize_impl(x)

printf("%s: %d\n", stringize(paste(number, 2)), paste(number, 2));

余談ですが、なぜこれをやろうとしているのでしょうか。きっともっと良い解決策があるはずです。

于 2013-09-01T18:15:02.227 に答える
2

GCC でコンパイルしている場合は、それを呼び出してgcc -E filename.cマクロの展開を確認できます。

編集:

#右側の記号を効果的に二重引用符で囲む stringize プリプロセッサ演算子を使用することもできます。

#include <stdio.h>

#define T(...) #__VA_ARGS__
#define paste(f, b) _paste(f, b)
#define _paste(front, back) front##back

int main()
{
    int n = 5;
    printf("macro expands to: '%s'\n", T(paste(number, 2), paste(number, 2)));
    printf("macro expands to: '%s'\n", T(paste(n, 2)));
    return 0;
}

このコードは、うまくいけば質問に答えます。

文字列化で貼り付けを展開するには、もう一度マクロを展開する必要があります。つまり、pasteマクロ内のstringizeマクロを展開するには、プリプロセッサがファイルをもう一度渡す必要があります。そのため、ファイルの後半で定義された別のマクロを介して渡します。

プリプロセッサのすべてのルールについて 100% 確信があるわけではありませんが、これはかなりうまくいくようです。別のマクロ内で展開したいマクロごとに、プリプロセッサにファイルを再度渡すように強制する魔法を行う必要があります:)私の知る限り、これを達成する方法はいくつかありますが、これは1つです。

EDIT2:

コードを編集しました。私はこの出力を得ています。これはあなたが望むものですか?

morten@laptop:/tmp$ ./a.out 
macro expands to: 'paste(number, 2), paste(number, 2)'
macro expands to: 'paste(n, 2)'
于 2013-09-01T18:18:41.183 に答える