有了PHP和Javascript编程的背景,在某些情况下,有时很难围绕C和C编译器的行为。我刚刚遇到的一种情况(编程AVR ATmega16微控制器)是将变量与定义的常量进行比较,这显然不起作用:
#define SYS_STATE_IDLE 0;
//...
char systemState = SYS_STATE_IDLE;
/...
// Main function body
int main(void) {
//...
for(;;) {
// Determine if a new key was pressed
if (keyPressed()) {
switch (systemState) {
case SYS_STATE_IDLE:
break;
default:
break;
}
}
}
return 0;
}
编译器(AVR GCC)在第一个case
:
../SunTrackerMainController.c:103: error: expected ':' or '...' before ';' token
../SunTrackerMainController.c:103: error: expected expression before ':' token
我也尝试了if
声明:
if (systemState == SYS_STATE_IDLE) {
// whatever
}
但结果基本相同:
../SunTrackerMainController.c:109: error: expected ')' before ';' token
我做错了什么?
答案 0 :(得分:5)
从;
的末尾删除#define
。目前,预处理器在您使用SYS_STATE_IDLE
的任何地方插入分号,这是您不想要的。
#define SYS_STATE_IDLE 0
答案 1 :(得分:4)
您必须记住,预处理器会替换宏逐字,因此只要它看到SYS_STATE_IDLE
,它就会用0;
替换它,所以语句
case SYS_STATE_IDLE:
将转换为
case 0;:
当你尝试在if
中使用它时,你得到
if (systemState == 0;)
宏替换后。
正如其名称所暗示的那样,预处理器是在编译器(“前”部分)之前运行以处理源的步骤。它是C语言中的自己的微语言,是由换行符而不是分号终止的语言。
答案 2 :(得分:1)
在#define
中,无论你在定义名称之后写什么,都会成为它的值。在这种情况下,0;
正在变为SYS_STATE_IDLE
的值,该值不应包含用作数值的分号。
答案 3 :(得分:0)
在预处理器之后,您的代码如下所示:
case 0;: {
现在您了解编译器抱怨的;
是什么?要解决此问题,请从;
删除define
。