#define出错

1 c++ constants global-variables c-preprocessor

我有一个文件,有很多#define语句,如 -

#ifndef UTILITY_H
#define UTILITY_H
#define BUMP 7;
#define WHEEL_DROPS 7;
#define WALL 8;
#define CLIFF_LEFT 9;
#define CLIFF_FRONT_LEFT 10;
#define CLIFF_FRONT_RIGHT 11;
#define CLIFF_RIGHT 12;
#define VIRTUAL_WALL 13;
...
... 
#endif
Run Code Online (Sandbox Code Playgroud)

该列表继续大约42个不同的值.我将此文件包含在我的其他文件中,但每当我尝试使用其中一个常量时,我​​都会收到错误.对于一个具体的例子,我尝试做 -

Sensor_Packet temp;
temp = robot.getSensorValue(BUMP); //line 54
cout<<temp.values[0]<<endl;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是 -

main.cpp:54: error: expected ‘)’ before ‘;’ token
main.cpp:54: error: expected primary-expression before ‘)’ token
main.cpp:54: error: expected ‘;’ before ‘)’ token
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我会收到这些错误,因为已经定义了BUMP.当我尝试使用switch语句时,也会发生这种情况 - 例如 -

switch(which) {
case BUMP:
    //do stuff
case CLIFF_LEFT:
   //do stuff
}
Run Code Online (Sandbox Code Playgroud)

我有什么东西可以留下来使用#define吗?我认为我所要做的就是定义一个常量然后我就可以调用它.任何帮助表示赞赏.

In *_*ico 9

仔细看看你的#defines:

#define BUMP 7;
Run Code Online (Sandbox Code Playgroud)

这告诉预处理器替换BUMP7;.请注意,宏定义包括分号!

所以你的代码实际上对编译器来说是这样的:

Sensor_Packet temp;
temp = robot.getSensorValue(7;);
cout<<temp.values[0]<<endl;

// ...

switch(which)
{
case 7;:
    // do stuff
case 9;:
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

哪些是明显的语法错误.要解决此问题,请删除#define语句中的分号.

但是在C++中,你应该使用const ints或enums作为常量而不是#defines.以下是一些可能的示例:

enum CliffPositions
{
    CLIFF_LEFT  = 9,
    CLIFF_FRONT_LEFT = 10,
    CLIFF_FRONT_RIGHT = 11,
    CLIFF_RIGHT = 12,
};

enum WallType
{
    WALL = 8,
    VIRTUAL_WALL = 13;
}

const int BUMP = 7;
const int WHEEL_DROPS = 7;

// etc ...
Run Code Online (Sandbox Code Playgroud)

这种方式是优选的,因为不同于#defines,const ints和enums方面的范围并且更加类型安全.