为什么我们不在宏定义的末尾加分号?
我知道预处理器处理代码的这些部分。这两者之间有关系吗?如果是,那是什么?
与编译器相比,它是否与预处理器处理事物的方式有何不同?如果是,这些差异是什么?
答案 0 :(得分:6)
宏定义只是直接替换文本,包括在那里放置一个分号;
。所以
#define MYVAR 4;
如果这样使用:
for (i=0; i<MYVAR ; i++)
将被翻译为:
for (i=0; i<4; ; i++)
哪个是错误的,会导致语法错误。不要被它可以工作或似乎工作的时刻所愚弄,没有副作用。例如:
int j = MYVAR;
转换为:
int j = 4;;
哪种方法有效,但不是一种好的工作方式。
答案 1 :(得分:1)
除了AntonH提供的例子
#define MAX(a, b) (a > b ? a : b)
int x = MAX(4, 5);
如果用分号定义了这个宏,你可以编写一个没有分号的语句,这看起来很奇怪:
#define MAX(a, b) (a > b ? a : b);
int x = MAX(4, 5)
答案 2 :(得分:1)
即使我们忘记了预处理器,C语言中也有很多地方 - 我们不会在事情结束时放置;
。事实上,人们可以争辩说,将;
置于某事的末尾比C中的规则更为例外。声明以;
和结尾表达式语句以;
中的;
和跳转语句结尾 - 以及{...}}。几乎在任何地方,当语言都需要;
时,出于某些正当的语法原因需要它。
在宏定义结束时需要;
的原因是什么?我什么也看不见。这可能就是为什么它不存在的原因。
答案 3 :(得分:0)
预处理指令(#define
,#include
,#if
,#ifdef
,#ifndef
等)不是语句,所以它们不会以分号结束;相反,它们由换行符终止。如果希望预处理指令跨越多个源代码行,则需要转义换行符,如下所示:
#define FOREACH( n, arg, func ) \
for( size_t i = 0; i < (n); i++ ) \
{ \
(func)((arg), i); \
}
就像其他人所说的那样,宏扩展只是愚蠢的文本替换,所以如果你在宏定义的末尾加一个分号,它将成为扩展的一部分,这几乎不是你想要的。