包含windows.h后无法定义枚举:语法错误

时间:2015-09-22 15:06:06

标签: c++ windows syntax-error visual-studio-2015

我们从一个大代码库中追溯了一个奇怪的语法错误的起源。以下代码:

#include <windows.h>

enum Element
{
    IN,    //(a)
    OUT
};         //(b)

无法在Visual Studio 2015下编译,给出错误:

(a) error C2059: syntax error: ','
(b) error C2143: syntax error: missing ';' before '}'
(b) error C2059: syntax error: '}'
  • 这段代码是非法的吗? (我希望不会)
  • 如果合法,这是一个已知问题吗?有解决方法吗?

3 个答案:

答案 0 :(得分:2)

这些是在Windows头文件中定义的宏,在minwinddef.h中的VS2015下。我建议更改您正在使用的命名约定,而不是INOUT使用InOut - 将所有大写名称保留为宏。如果您无法更改名称 - 那么您将继续使用#undef,如果您不在代码中使用IN和OUT,那么它应该是安全的,据我所知,这些仅用于指示参数是否预期是否作为返回值。

答案 1 :(得分:0)

INOUT是在windows.h中定义的宏。

// Windows.h:79-84
#ifndef IN
#define IN
#endif

#ifndef OUT
#define OUT
#endif

由于您使用的是windows.h,我的建议不是#undefine它们(您可能正在使用依赖于此宏的Windows.h中的内容),而是更改您的代码:

// Note: as pointed out by  πάντα ῥεῖ:
// Prefixed _ are reserved for standerd implementations.
// Perhaps you should use In and Out instead.
enum Element
{
    _IN,   
    _OUT
};    

答案 2 :(得分:0)

INOUT的名称过于通用,正如您所见,碰撞的可能性很高。

如您所见,它们已在windows.h中使用。尝试将它们放在命名空间中,尝试使用enum class或使用更多描述性名称,以避免名称冲突。你也可以#undef这些宏,但在我看来这不是一个好主意。