2012-08-02 259 views
7

編譯下面的代碼時,我收到以下錯誤:<錯誤C2059:語法錯誤: '常量'>與編譯時const int的

3>c:\hedge\hedge\hedge\AisTarget.h(22) : error C2059: syntax error : 'constant' 
3>c:\hedge\hedge\hedge\AisTarget.h(22) : error C2238: unexpected token(s) preceding ';' 

#if !defined(AisTarget_h) 
#define AisTarget_h 

#include "GeneralAviationItems.h" 
#include <string> 

namespace HEDGE { 
    using namespace GeneralAviation; 

    class AisTarget : public WaypointLatLon { 
     public: 
      static const int NO_DATA = -1000; //here is the error 
    };  
} // end namespace HEDGE 

#endif 
+0

您的'#if!defined'可以替換爲#ifndef'順便說一句。 – chris 2012-08-02 16:44:05

+0

如果你用'enum {NO_DATA = -1000};'替換'static const int NO_DATA = -1000;''它會起作用嗎?在那種情況下,你有一個非常古老的編譯器。請不要告訴我們您正在使用Visual Studio 6 ;-) – fredoverflow 2012-08-02 16:44:41

+13

這段代碼實際上並不會用於航空,是嗎?使用visual studio 2008 express的 – stijn 2012-08-02 16:45:07

回答

18

很可能NO_DATA是已經在其他地方被定義爲一個宏,因此它正在擴展成與編譯器的變量名稱不一致的東西。嘗試重新命名NO_DATA到別的東西。

如果沒有這樣的衝突,那麼它的編碼就會很好地編譯,如here所示。

+0

其實很好。 – chris 2012-08-02 16:46:27

+0

這就是爲什麼我不在C++中使用大寫標識符的原因。標準庫中過多的魯莽命名的宏。 windows.h很可怕 – kotlomoy 2013-05-29 21:24:00

+0

@ kotlomoy:是的,這是一個很好的做法。至少,大寫標識符應該有一些可區分的前綴或後綴以避免這種衝突(最好以混合或小寫形式)。 – jxh 2013-05-29 21:37:13

3

即使這篇文章有它的年齡:即使不考慮大寫/小寫,多重定義共存時,通常會發生錯誤。 這包括解決方案的.vcprojx文件中的潛在預處理器定義!。考慮類似

<ItemDefinitionGroup> 
    <ClCompile> 
     <PreprocessorDefinitions>$(Configuration);%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    </ClCompile> 
    </ItemDefinitionGroup> 

在上述文件中。現在,使用「Debug」和「Release」配置,您很可能會遇到一些問題和C2059錯誤的潛在來源。我經歷了這種進退兩難的局面。

+0

哇,剛剛發生在我身上,感謝你的帖子,我能夠立即修復它。 – MoneyBall 2017-04-09 15:18:14