c++ 错误C2059:语法错误:'常数'

yuvru6vn  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(454)

我得到了一段自动生成的代码,它可以在Linux上编译,但不能在Windows上使用Visual Studio 2008 Express编译。我遇到的问题是我不理解编译器错误。我不认为我可以发布确切的代码,所以这里有一个消毒版本...
声明静态常量DELETE的行报告错误。**注意:**编译此文件时不会显示编译器错误-它成功构建到库中,但会显示在包含头文件的第二个项目中(间接)。我相信至少有一两个其他项目将它间接地包含在解决方案中-他们在编译时没有问题。
File_A.h:

  1. enum LONG_TYPE_NAME {
  2. ENUM_NAME_PREFIX_ADD = 0,
  3. ENUM_NAME_PREFIX_CHANGE = 1,
  4. ENUM_NAME_PREFIX_DELETE = 2,
  5. ENUM_NAME_PREFIX_SOMETHINGELSE = 3,
  6. };
  7. //Lots of code here
  8. class FOO : public ::LIBRARY_NAME {
  9. public:
  10. //Some stuff
  11. private:
  12. //Some stuff
  13. public:
  14. //Some more stuff
  15. typedef LONG_TYPE_NAME SHORT_NAME;
  16. static const SHORT_NAME ADD = ENUM_NAME_PREFIX_ADD;
  17. static const SHORT_NAME CHANGE = ENUM_NAME_PREFIX_CHANGE;
  18. /* compiler error for the following line only*/
  19. static const SHORT_NAME DELETE = ENUM_NAME_PREFIX_DELETE;
  20. static const SHORT_NAME SOMETHINGELSE = ENUM_NAME_PREFIX_SOMETHINGELSE;
  21. //More stuff
  22. };

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

  1. #ifndef _MSC_VER
  2. const LONG_TYPE_NAME FOO::ADD;
  3. const LONG_TYPE_NAME FOO::CHANGE;
  4. const LONG_TYPE_NAME FOO::DELETE;
  5. //More stuff
  6. #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)。

6yoyoihd

6yoyoihd1#

肯定有一个宏DELETE定义在某个地方。

xnifntxz

xnifntxz2#

作为AnT stated,在之前的某个地方存在冲突的#define
对于周围的其他人,我想补充一下:
不幸的是,这种冲突经常发生在包含Windows.h时,例如从winerror.h得到#define NO_ERROR 0L
因此,当您知道您的系统有自己的NO_ERROR时,我建议将Windows.h的include封装在mywindows.h中,如下所示:

  1. # if defined NO_ERROR
  2. # error Unfortunately, there is a conflict with define NO_ERROR from Windows Kits\10\include\*\shared\winerror.h. Please include mywindows.h first.
  3. # endif
  4. # include "Windows.h"
  5. # if defined NO_ERROR
  6. # undef NO_ERROR
  7. /* until someone really needs THIS winerror define */
  8. # endif

相关问题