将变量与常量进行比较不起作用?

时间:2013-11-10 10:58:36

标签: c constants

有了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

我做错了什么?

4 个答案:

答案 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