两者的区别定义了什么?

时间:2013-12-20 08:30:08

标签: c c-preprocessor

两个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

3 个答案:

答案 0 :(得分:3)

使用#,你要求不要。所有#所做的就是 stringify 紧跟其后的事物。我认为你试图利用的成语是一个常见的:

#define STR(_a)   #_a
#define XSTR(_a)  STR(_a)

#define BAR foo

设置这样的东西,

STR(BAR) 

会给你"BAR"

XSTR(BAR)

会给你"foo"

答案 1 :(得分:2)

请看这个链接:

Stringification

最后说:

  

如果要对宏参数的扩展结果进行字符串化,则必须使用两级宏。

 #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