我想与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
”。
有什么理由不能这样做吗?
答案 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的其余部分更加集成。
但是在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
再见