假设我有一些宏#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 手册:
与普通参数替换不同,参数不是首先进行宏扩展的。这称为字符串化。
来自同一来源:
如果要对宏参数扩展的结果进行字符串化,则必须使用两级宏。
...继续举一个例子:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"