带有VS2015的C代码中的无范围枚举

时间:2015-09-25 15:01:18

标签: c c++11 visual-c++ enums visual-studio-2015

我正在尝试使用VS 2015和Windows 10 SDK编译Python的psutil模块。编译失败,出现以下错误:

c:\users\builder\documents\code\psutil\psutil\arch\windows\ntextapi.h(212): error C2365: 'ProcessBreakOnTermination': redefinition; previous definition was 'enumerator'
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\um\winternl.h(308): note: see declaration of 'ProcessBreakOnTermination'
c:\users\builder\documents\code\psutil\psutil\arch\windows\ntextapi.h(212): error C2086: '_PROCESSINFOCLASS2 ProcessBreakOnTermination': redefinition
c:\users\builder\documents\code\psutil\psutil\arch\windows\ntextapi.h(212): note: see declaration of 'ProcessBreakOnTermination'

进一步调查显示,ProcessBreakOnTermination是winternl.h中枚举(PROCESSINFOCLASS)的一部分。

我认为这与C ++ 11执行范围内的枚举有关:https://msdn.microsoft.com/en-us/library/vstudio/2dzy4k6e(v=vs.110).aspx

但是,我对如何解决这个问题很感兴趣。如果我尝试在MS网站上添加详细的类或结构位,我会收到编译器错误,因为它被编译为C代码。为什么C ++ 11规则适用于C代码?

1 个答案:

答案 0 :(得分:0)

我想出的解决方案是在#if。

中包含有问题的双重定义符号
(start of enum)
(last good entry)
#if _MSC_VER < 1900
(offending enum entry)
#endif
(next entry) = (last_good_entry)+2

欢迎任何更好的解决方案!