Macros 引用宏参数的预处理器

Macros 引用宏参数的预处理器,macros,c-preprocessor,stringification,Macros,C Preprocessor,Stringification,假设我有一个宏#define NAME,我想定义另一个宏,它将扩展到引用的值。也就是说,好像我也定义了#define NAME_STR“NAME”。有没有比下面更整洁的方法 #define QUOT(str) #str #define QUOT_ARG(str) QUOT(str) #define NAME_STR QUOT_ARG(NAME) 不太可能,因为在字符串化中使用宏参数时不会展开。从: 与正常的参数替换不同, 参数不是宏展开的 第一。这就是所谓的严格化 来自同一来源:

假设我有一个宏
#define NAME
,我想定义另一个宏,它将扩展到引用的值。也就是说,好像我也定义了
#define NAME_STR“NAME”
。有没有比下面更整洁的方法

#define QUOT(str)   #str
#define QUOT_ARG(str)   QUOT(str)
#define NAME_STR    QUOT_ARG(NAME)

不太可能,因为在字符串化中使用宏参数时不会展开。从:

与正常的参数替换不同, 参数不是宏展开的 第一。这就是所谓的严格化

来自同一来源:

如果你想把结果串起来 宏参数的展开,您可以 必须使用两级宏

…下面是一个例子:

 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4
 str (foo)
      ==> "foo"
 xstr (foo)
      ==> xstr (4)
      ==> str (4)
      ==> "4"

该示例具有误导性:
foo
在替换列表中使用之前不会被宏替换为
4
,因此它应该是
xstr(foo)
变成
str(4)
变成
“4”
。我认为,如果说有一点你有
xstr(4)
,那就是误导。@James McNellis:同意,这个例子暗示了一些类似于自引用宏的东西,以后不会扩展。我想知道我是应该编辑这个例子还是留下它,以及这些评论。。。