错误 C2059:语法错误: 'constant'

error C2059: syntax error : 'constant'

本文关键字:错误 constant 语法 C2059      更新时间:2023-10-16

我有一段自动生成的代码,可以在Linux上编译,但不能在使用Visual Studio 2008 Express的Windows上编译。我遇到的问题是我不了解编译器错误。我认为我无法发布确切的代码,所以这里有一个经过净化的版本......

对于

声明静态常量 DELETE 的行报告错误。注意:编译此文件时,编译器错误不会显示 - 它成功构建到库中,但会显示在包含标头的第二个项目中(间接(。我相信至少有一两个其他项目将其间接包含在解决方案中 - 它们在编译时没有问题。

File_A.h:

enum LONG_TYPE_NAME {
  ENUM_NAME_PREFIX_ADD = 0,
  ENUM_NAME_PREFIX_CHANGE = 1,
  ENUM_NAME_PREFIX_DELETE = 2,
  ENUM_NAME_PREFIX_SOMETHINGELSE = 3,
};
//Lots of code here
class FOO : public ::LIBRARY_NAME {
 public:
  //Some stuff
  private:
  //Some stuff
  public:
  //Some more stuff
  typedef LONG_TYPE_NAME SHORT_NAME;
  static const SHORT_NAME ADD = ENUM_NAME_PREFIX_ADD;
  static const SHORT_NAME CHANGE = ENUM_NAME_PREFIX_CHANGE; 
  /* compiler error for the following line only*/
  static const SHORT_NAME DELETE = ENUM_NAME_PREFIX_DELETE; 
  static const SHORT_NAME SOMETHINGELSE = ENUM_NAME_PREFIX_SOMETHINGELSE; 
  //More stuff
};

常量本身只出现在一个地方(当我在项目中搜索术语 DELETE 时(:

File_A.cc:

#ifndef _MSC_VER
const LONG_TYPE_NAME FOO::ADD;
const LONG_TYPE_NAME FOO::CHANGE;
const LONG_TYPE_NAME FOO::DELETE;
//More stuff
#endif  // _MSC_VER

报告的错误是error C2059: syntax error : 'constant'(后跟error C2258: illegal pure syntax, must be '= 0'error C4430: missing type specifier - int assumed. Note: C++ does not support default-int,我认为这些错误不相关(,但在编译上述文件时则不然。

这些文件被编译到一个由另一个项目(C++(静态链接到的库 - 这是产生错误的库(以及在执行类似操作的第二个.cpp文件中(。当我注释掉所有代码时,它仍然会显示,所以我认为它与标题包含有关。

注释掉生成错误的行会使构建在 Windows 上工作(并且在 Linux 上失败,但我认为在 ifndef 中注释掉它的对应项应该可以解决这个问题(,但我真的很想知道为什么编译器在该特定行失败以及错误实际上意味着什么。此外,最好不要修改自动生成的代码。

编辑:将术语拆分为单独的行会使编译器指向 DELETE 行。也许在某处自动定义了一个名为 DELETE 的宏?

编辑2:稍微清理了标题部分,以消除一些可能的误解。顺便说一下,重命名 DELETE 变量也会清除错误。

编辑3:显然,我需要了解有关VS的更多信息 -/P生成预处理的文件而不生成目标文件,因此构建当然会失败而不会产生编译错误。此外,它看起来确实在某处有一个宏,它将 DELETE 定义为 (0x00010000L(。

肯定

在某处定义了宏DELETE

正如AnT所说,之前某处存在冲突#define

对于其他来的人,我想添加:
不幸的是,当包含Windows.h时,例如来自 .
winerror.h#define NO_ERROR 0L时,这种冲突经常发生。所以当你知道,你的系统有自己的NO_ERROR,我建议将Windows.h的包含封装在一个mywindows.h中,如下所示:

# if defined NO_ERROR
#  error Unfortunately, there is a conflict with define NO_ERROR from Windows Kits10include*sharedwinerror.h. Please include mywindows.h first.
# endif
# include "Windows.h"
# if defined NO_ERROR
#  undef NO_ERROR
   /* until someone really needs THIS winerror define */
# endif