2012-08-02 101 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