【发布时间】:2015-09-05 02:50:20
【问题描述】:
#define A;
#ifdef A
(...)
#endif
我以为前任会认为这是错误的;但是它会进入这种状态。是A和A;一样吗?
【问题讨论】:
#define A;
#ifdef A
(...)
#endif
我以为前任会认为这是错误的;但是它会进入这种状态。是A和A;一样吗?
【问题讨论】:
不,它们是不同的。
在
#define A;
A 和 ; 是两个不同的标记。 A 是宏名称,; 是它的定义。所以你可以,如果你真的想,写:
printf("Hello, world\n")A
它相当于
printf("Hello, world\n");
(但请不要那样做。)
由于您对A 所做的唯一事情就是在#ifdef 中引用它,因此您所做的就是测试它是否已被定义,而不管它是如何定义的。分号无关紧要,因为您不使用它。
出于风格和清晰度的考虑,您应该始终在宏名称和它的定义之间留一个空格:
#define A ;
如果扩展的第一个标记是( 字符,这一点尤其重要。如果它紧跟在宏名称之后,则您有一个类似函数的宏定义(宏接受参数)。如果宏名称和( 之间有空格,则( 只是宏扩展的一部分。
说到分号,一个常见的错误是在宏定义中包含不必要的分号:
#define THE_ANSWER 42;
...
printf("The answer is %d\n", THE_ANSWER);
由于分号是宏定义的一部分,因此扩展为:
printf("The answer is %d\n", 42;);
这是一个语法错误。
【讨论】: