2011-04-01 100 views
0

假设我有一些宏#define NAME name,并且我想定义一些其他的宏,这些宏将扩展到引用的值。就是说,如果我也定义了#define NAME_STR "name"。有没有比以下更好的方法?预处理器引用宏参数

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

回答

2

不是真的,因为宏参数在使用字符串化时没有展开。从GNU C PreProcessor manual

不同于一般的参数替代, 参数不是宏扩展 第一。这被称为字符串化。

来自同一来源:

如果你想字符串化 扩展宏论证的结果,你 必须使用宏的两个层次。

...这用一个例子继续:

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

的例子是一种误导:'foo'不是宏替换成为'4',直到它被替换列表中使用,因此它应该'xstr(foo)'变成'str(4)'变成'“4”'。说,有一点你有'xstr(4)'是误导,我想。 – 2011-04-01 22:59:55

+0

@詹姆斯麦克奈利斯:同意,这个例子暗示了一些沿着自我指涉的宏观的东西,事后不会扩大。我想知道我是否应该编辑这个例子,或者留下它以及这些评论...... – thkala 2011-04-01 23:32:34