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

时间:2010-12-26 21:56:25

标签: c

我想与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 ”。

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

6 个答案:

答案 0 :(得分:11)

从INVALID_VALUE定义中删除分号。

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

if (test==-999;)

这是无效的C语法。

答案 1 :(得分:6)

您需要移除;中的#define INVALID_VALUE -999;。请参阅the fixed code

您可以通过了解错误消息expected ‘)’ before ‘;’ token告诉您的内容来解决此问题。它告诉您,它希望在)令牌之前找到;,但仅通过检查该行您就看不到;。那么也许INVALID_VALUE的定义中有一个?抬头看#define INVALID_VALUE -999;就在那里!认为应该在那里,但不确定?所以让我们尝试删除它,看看它是否有效。成功了!

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

  

宏定义,无论如何   他们是否扩展到单一或   多个陈述不应该   用分号结束。如果   要求,分号应该是   包含在宏之后   扩张。无意中插入了一个   分号结束时的分号   定义可以意外地改变   控制程序的流程。

     

避免此问题的另一种方法是   更喜欢内联或静态功能   过度功能宏。

     

一般来说,程序员应该   确保没有分号   宏定义的结束。该   有分号的责任   在使用这种情况时需要的地方   宏应该委托给   调用宏的人。

答案 2 :(得分:3)

C预处理器宏语言与C

不同

应删除宏定义中的 ;

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

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

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

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

答案 3 :(得分:2)

末尾的半结肠
#define INVALID_VALUE -999;

经典。

答案 4 :(得分:2)

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

因此,

#define IDENTIFIER 10;
int j = IDENTIFIER;

将扩展为:

int j = 10;;

答案 5 :(得分:2)

更改宏

从:

#define INVALID_VALUE -999;

#define INVALID_VALUE -999

再见