C宏中是否忽略分号?

时间:2015-09-05 02:50:21

标签: c macros

#define A;

#ifdef A
    (...)
#endif

我认为前任会认为这是假的;但它会进入这种状况。是A和A;采取相同的方式?

1 个答案:

答案 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;);

这是语法错误。