为什么#define INVALID_VALUE -999; 使用时会出现语法错误?

我试图与C中定义的常量进行比较,并将我的程序简化为以下内容:

#include "stdio.h" #include "stdlib.h" #define INVALID_VALUE -999; int main(void) { int test=0; if(test==INVALID_VALUE) //The error line.. return INVALID_VALUE; return 0; } 

当我使用gcc进行编译时,它会error: expected ')' before ';' token发出错误“ error: expected ')' before ';' token error: expected ')' before ';' token “。

有什么理由不能这样做吗?

从INVALID_VALUE定义中删除分号。

宏被词法(逐个字符)替换,而不了解它们周围的语法。 您的宏INVALID_VALUE设置为-999; ,所以你的if行将宏扩展为:

 if (test==-999;) 

这是无效的C语法。

你需要删除;#define INVALID_VALUE -999; 。 查看固定代码 。

您可以通过了解错误消息expected ')' before ';' token达成此结论expected ')' before ';' token expected ')' before ';' token告诉你。 它告诉你,它有望在之前找到a ) ; 令牌,但从单独检查线你没有看到; 。 那么也许INVALID_VALUE的定义中有一个? 查看#define INVALID_VALUE -999; 它就在那里! 认为应该在那里,但不确定? 所以,让我们尝试删除它,看看它是否有效。 成功!

这个页面解释了为什么你不应该用分号来结束#define ,即使在使用宏时需要它。 尽可能多地从错误中学习,这样你就不会再犯错了。 引用:

宏定义,无论它们是扩展为单个还是多个语句,都不应以分号结束。 如果需要,应在宏扩展后包含分号。 无意中在宏定义的末尾插入分号可能会意外地更改程序的控制流。

避免此问题的另一种方法是优先使用内联函数或静态函数而不是函数式宏。

通常,程序员应确保在宏定义的末尾没有分号。 在使用这样一个宏时需要使用分号的责任应该委托给调用宏的人。

C预处理器宏语言与C不同


; 在宏定义中应该删除。

这是一个可以理解的错误。 如果C是今天设计的,那么宏语言可能与C的其余部分更加集成。

但是在20世纪70年代早期C发明时的16位机器上,写一个过于复杂的程序是不明智的。 它最终会变得毫无用处,因为没有剩余的内存可以实际运行大型杰作程序,甚至简单的程序运行缓慢。

所以C被分成了一个相当简单的宏预处理器,最初是一个完全独立的程序,而编译器也是如此。 预处理程序没有尝试解析C而不理解词法分析模型。

当32位机器接管时,预处理器通常被集成到解析器中,但自然语言需要保持不变。

最后的半结肠

 #define INVALID_VALUE -999; 

经典。

在定义某些内容后,您不需要分号。 #define实际上是一个宏,它将在编译时进行内联扩展。

从而,

 #define IDENTIFIER 10; int j = IDENTIFIER; 

将扩展为:

 int j = 10;; 

改变宏

从:

 #define INVALID_VALUE -999; 

 #define INVALID_VALUE -999 

再见