我有一个包含许多#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

该列表包含约42个不同的值。我将此文件包含在其他文件中,但是每当尝试使用这些常量之一时,都会出错。对于特定示例,我尝试做-
Sensor_Packet temp;
temp = robot.getSensorValue(BUMP); //line 54
cout<<temp.values[0]<<endl;

我得到的错误是-
main.cpp:54: error: expected ‘)’ before ‘;’ token
main.cpp:54: error: expected primary-expression before ‘)’ token
main.cpp:54: error: expected ‘;’ before ‘)’ token

我不明白为什么会得到这些错误,因为已经定义了BUMP。当我尝试使用带有定义的情况的switch语句时,也会发生这种情况-
switch(which) {
case BUMP:
    //do stuff
case CLIFF_LEFT:
   //do stuff
}

关于#define我有什么遗漏之处吗?我以为我需要做的就是定义一个常量,然后就可以调用它了。任何帮助表示赞赏。

最佳答案

仔细看看#define:

#define BUMP 7;

这告诉预处理器将BUMP替换为7;。请注意,宏定义包括分号!

因此,对于编译器,您的代码实际上看起来像这样:
Sensor_Packet temp;
temp = robot.getSensorValue(7;);
cout<<temp.values[0]<<endl;

// ...

switch(which)
{
case 7;:
    // do stuff
case 9;:
    //do stuff
}

显然是语法错误。要解决此问题,请删除#define语句中的分号。

但是在C++中,您应该对常量使用const int enum 而不是#define。以下是一些可能的示例:
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 ...

这种方式是可取的,因为与#define不同,const intenum尊重范围,并且类型安全性更高。

07-24 09:46
查看更多