2011-03-28 41 views
1

我有有許多#define語句,如一個文件 -與錯誤的#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?我認爲我所要做的就是定義一個常量,然後我可以稱之爲它。任何幫助表示讚賞。

+0

剛剛出現在關於最喜歡的單行C++ bug(昨天?)的問題上。 – 2011-03-28 02:12:21

回答

9

#define先來仔細看看:

#define BUMP 7; 

這告訴預處理器與7;更換BUMP。請注意,宏定義包含分號!

所以,你的代碼實際上是這樣的編譯器:

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代替常數,而不是#define s。下面是一些可能的例子:

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的尊重範圍和更類型安全。

+0

(+1)澄清:在所有'#define'語句 – 2011-03-28 02:07:37

+0

+1擊敗我之後刪除';'。關於在這裏使用#define的好處。 – jmccarthy 2011-03-28 02:08:49

2

刪除分號,你應該很好去。

相關問題