两个define
的区别是什么?
#define NUM 123
#define NUM_TO_STRING1(x) #x
#define NUM_TO_STRING(x) NUM_TO_STRING1(x)
printf("NUM_TO_STRING1: %s\n", NUM_TO_STRING1(NUM));
printf("NUM_TO_STRING: %s\n", NUM_TO_STRING(NUM));
结果:
NUM_TO_STRING1: NUM
NUM_TO_STRING: 123
为什么NUM_TO_STRIN1
无法将NUM
更改为字符串123
?
答案 0 :(得分:3)
使用#
,你要求不要。所有#
所做的就是 stringify 紧跟其后的事物。我认为你试图利用的成语是一个常见的:
#define STR(_a) #_a
#define XSTR(_a) STR(_a)
#define BAR foo
设置这样的东西,
STR(BAR)
会给你"BAR"
和
XSTR(BAR)
会给你"foo"
答案 1 :(得分:2)
请看这个链接:
最后说:
如果要对宏参数的扩展结果进行字符串化,则必须使用两级宏。
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"
并阅读here关于宏中参数扫描的顺序:
宏参数在被替换为宏体之前完全是宏扩展的,除非它们被字符串化或粘贴到其他标记。替换后,将再次扫描整个宏体(包括替换参数),以便扩展宏。结果是参数被扫描两次以扩展其中的宏调用。
答案 2 :(得分:1)
在你的情况下:
NUM_TO_STRING1(NUM)变为NUM
使用#,NUM会被字符串化。不能替换为123。
NUM_TO_STRING(NUM)变为NUM_TO_STRING1(123)
123是字符串化的,结果是123