我们从一个大代码库中追溯了一个奇怪的语法错误的起源。以下代码:
#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: '}'
答案 0 :(得分:2)
这些是在Windows头文件中定义的宏,在minwinddef.h中的VS2015下。我建议更改您正在使用的命名约定,而不是IN
和OUT
使用In
和Out
- 将所有大写名称保留为宏。如果您无法更改名称 - 那么您将继续使用#undef
,如果您不在代码中使用IN和OUT,那么它应该是安全的,据我所知,这些仅用于指示参数是否预期是否作为返回值。
答案 1 :(得分:0)
IN
和OUT
是在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)
IN
和OUT
的名称过于通用,正如您所见,碰撞的可能性很高。
如您所见,它们已在windows.h
中使用。尝试将它们放在命名空间中,尝试使用enum class
或使用更多描述性名称,以避免名称冲突。你也可以#undef
这些宏,但在我看来这不是一个好主意。