Ошибки с #define - PullRequest
       353

Ошибки с #define

1 голос
/ 28 марта 2011

У меня есть файл, который содержит много операторов #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?Я думал, что все, что мне нужно было сделать, это определить константу, и тогда я мог просто назвать ее.Любая помощь приветствуется.

Ответы [ 2 ]

9 голосов
/ 28 марта 2011

Присмотритесь к вашим #define s:

#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 s или enum s для констант вместо #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 ...

Этот способ предпочтительнее, поскольку в отличие от #define s, const int s и enum s относятся к области видимости и более безопасны для типов.

2 голосов
/ 28 марта 2011

Удалите точки с запятой, и вы должны быть в порядке.

...