5

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

声明静态 const 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)。

4

1 回答 1

12

肯定在DELETE某处定义了一个宏。

于 2012-05-09T16:42:26.243 回答