0

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

4 回答 4

5

从. ;_ #define目前,预处理器在您使用的任何地方插入一个分号SYS_STATE_IDLE,这是您不想要的。

#define SYS_STATE_IDLE 0
于 2013-11-10T11:01:31.060 回答
4

您必须记住,预处理器逐字替换宏,因此每当它看到SYS_STATE_IDLE它时都会将其替换为0;,所以语句

case SYS_STATE_IDLE:

将转变为

case 0;:

当你尝试在里面使用它时if,你会得到

if (systemState == 0;)

宏替换后。

预处理器,顾名思义,是在编译器(“pre”部分)之前运行以处理源代码的步骤。它是更大的语言 C 中自己的微语言,并且由换行符而不是分号终止。

于 2013-11-10T11:02:55.097 回答
1

#define任何你写在定义名称之后的内容都会成为它的值。在这种情况下,0;正在成为SYS_STATE_IDLE不应包含用作数值的分号的值。

于 2013-11-10T11:06:27.890 回答
0

在预处理器之后,您的代码如下所示:

case 0;: {

现在你明白;编译器在抱怨什么了吗?要解决此问题,请;define.

于 2013-11-10T11:02:03.250 回答