宏定义语法

时间:2017-03-13 19:47:01

标签: c

为什么我们不在宏定义的末尾加分号?

我知道预处理器处理代码的这些部分。这两者之间有关系吗?如果是,那是什么?

与编译器相比,它是否与预处理器处理事物的方式有何不同?如果是,这些差异是什么?

4 个答案:

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

就像其他人所说的那样,宏扩展只是愚蠢的文本替换,所以如果你在宏定义的末尾加一个分号,它将成为扩展的一部分,这几乎不是你想要的。