いくつ#define NAME name
かのマクロがあり、引用された値に展開される他のマクロを定義したいとします。つまり、あたかも も定義したかのようです#define NAME_STR "name"
。以下よりもきちんとした方法はありますか?
#define QUOT(str) #str
#define QUOT_ARG(str) QUOT(str)
#define NAME_STR QUOT_ARG(NAME)
いくつ#define NAME name
かのマクロがあり、引用された値に展開される他のマクロを定義したいとします。つまり、あたかも も定義したかのようです#define NAME_STR "name"
。以下よりもきちんとした方法はありますか?
#define QUOT(str) #str
#define QUOT_ARG(str) QUOT(str)
#define NAME_STR QUOT_ARG(NAME)
文字列化で使用される場合、マクロ引数は展開されないため、そうではありません。GNU C PreProcessor マニュアルから:
通常のパラメータ置換とは異なり、引数は最初にマクロ展開されません。これを文字列化と呼びます。
同じソースから:
マクロ引数の展開結果を文字列化する場合は、2 レベルのマクロを使用する必要があります。
...例を続けます:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"