C 宏定义语法

C 宏定义语法,c,C,为什么不在宏定义的末尾加上分号呢 我知道预处理器处理代码的这些部分。这两者之间有关系吗?如果是,是哪一种 与编译器相比,预处理器处理事情的方式是否有所不同?如果是,这些区别是什么 宏定义只是简单的文本替换,包括如果您放置分号那里。所以 #define MYVAR 4; 如果如此使用: for (i=0; i<MYVAR ; i++) 翻译为: int j = 4;; 这是可行的,但不是一个好的工作方式。除了Antoh给出的例子之外 #define MAX(a, b) (a >

为什么不在宏定义的末尾加上分号呢

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


与编译器相比,预处理器处理事情的方式是否有所不同?如果是,这些区别是什么

宏定义只是简单的文本替换,包括如果您放置分号
那里。所以

#define MYVAR 4;
如果如此使用:

for (i=0; i<MYVAR ; i++)
翻译为:

int j = 4;;

这是可行的,但不是一个好的工作方式。

除了Antoh给出的例子之外

#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)

即使我们忘记了预处理器,在C语言中也有很多地方我们没有放置
在事情的结尾。事实上,有人可能会说比C中的规则更像是一个例外。声明以
结尾和表达式语句以
结尾
和jump语句以
结尾-就是这样。当
时,几乎到处都是
是语言本身所需要的,它是出于一些合理的语法原因而需要的

需要
的原因是什么在宏定义的末尾?我没有看到。这可能就是它不存在的原因。

预处理指令(
\define
\include
\if
\ifdef
\ifndef
等)不是语句,因此它们不会以分号结尾;相反,它们以换行符结尾。如果希望预处理指令跨越多个源行,则需要对换行符进行转义,如下所示:

#define FOREACH( n, arg, func )     \
  for( size_t i = 0; i < (n); i++ ) \
  {                                 \
    (func)((arg), i);               \
  }                                  
#定义FOREACH(n,arg,func)\
对于(大小i=0;i<(n);i++)\
{                                 \
(func)((arg),i)\
}                                  

正如其他人所说,宏扩展只是愚蠢的文本替换,因此,如果在宏定义的末尾加上分号,它将是扩展的一部分,这几乎不是您想要的。

另外
int j=MYVAR
没有分号(宏巫术)是一件坏事。别这样,我明白了。因此,它可以防止语法上的缺陷。非常感谢。@d3l我想如果我看到这个,我的眼睛会发麻的:)
#define MAX(a, b) (a > b ? a : b);
int x = MAX(4, 5)
#define FOREACH( n, arg, func )     \
  for( size_t i = 0; i < (n); i++ ) \
  {                                 \
    (func)((arg), i);               \
  }