我得到了一段自动生成的代码,它可以在Linux上编译,但不能在Windows上使用Visual Studio 2008 Express编译。我遇到的问题是我不理解编译器错误。我不认为我可以发布确切的代码,所以这里有一个消毒版本...
声明静态常量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中的对应部分应该可以解决这个问题),但我真的很想知道为什么编译器在那一行失败,以及错误的实际含义。另外,最好不要修改自动生成的代码。
**EDIT:**将术语拆分为单独的行,使编译器指向DELETE行。也许有一个宏自动定义为DELETE的名字?
**编辑2:**清理了标题部分一点,以清除一些可能的误解。顺便说一下,重命名DELETE变量也可以清 debugging 误。
**编辑3:**显然我需要了解更多关于VS - /P生成预处理文件而不生成目标文件的信息,因此构建当然会失败而不会产生编译错误。而且,它看起来确实像是某处有一个宏,它将DELETE定义为(0x 00010000 L)。
2条答案
按热度按时间6yoyoihd1#
肯定有一个宏
DELETE
定义在某个地方。xnifntxz2#
作为AnT stated,在之前的某个地方存在冲突的
#define
。对于周围的其他人,我想补充一下:
不幸的是,这种冲突经常发生在包含
Windows.h
时,例如从winerror.h
得到#define NO_ERROR 0L
。因此,当您知道您的系统有自己的
NO_ERROR
时,我建议将Windows.h
的include封装在mywindows.h
中,如下所示: