#define A;
#ifdef A
(...)
#endif
我认为前任会认为这是假的;但它会进入这种状况。是A和A;采取相同的方式?
答案 0 :(得分:12)
不,他们是截然不同的。
在
#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;);
这是语法错误。