我有一段代码是自动生成的,可以在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)。
答案 0 :(得分:10)
某处确定有一个宏DELETE
。