奇怪的错误C2065:'错误':未声明的标识符

时间:2013-05-31 07:11:35

标签: c++ windows

作为更大项目(Mozilla Firefox的ff activex插件)的一部分,有以下代码片段:

if (CombineRgn(hrgnClip, hrgnClip, hRGN, RGN_AND) != ERROR)
{
        ::InvalidateRgn(m_hWndParent, hrgnClip, fErase);
}

当我在VS2012中构建时,我得到" 错误C2065:' ERROR' :未声明的标识符" ERROR在wingdi.h中定义如下:

...
/* Region Flags */
#define ERROR               0  // it wont build when this macro is used
#define NULLREGION          1  // it builds when this macro is used
#define SIMPLEREGION        2
#define COMPLEXREGION       3
#define RGN_ERROR ERROR
...

奇怪的是,如果我使用NULLREGION或SIMPLEREGION(只是在同一个文件中的宏,只是在违规的下面只有两行)替换ERROR(只是为了看它是否构建正常) if 语句,代码构建正常。当我使用ERROR时,代码不会构建。 上面定义的ERROR宏是否可能被某些关键字或其他宏或Visual Studio屏蔽掉?

1 个答案:

答案 0 :(得分:3)

这里的问题是ERROR实际上出现在编译错误消息中。这不应该发生,预处理器应该用0代替它。

所以某处在.h文件中#included在windows.h之后,一些程序员将10秒的快捷方式用于宏名称冲突问题并写下:

  #undef ERROR

您需要找到该行并将其删除。由于这是一个您不拥有的文件,并且未来很可能会更新,因此可能很难并且有可能给您带来维护问题,迫使您一次又一次地进行更改。另一种方法是自己重新定义:

#define MYGDIERROR 0
...
if (CombineRgn(hrgnClip, hrgnClip, hRGN, RGN_AND) != MYGDIERROR)
//etc...

这仍然会给您一个维护问题,并要求您下注CombineRgn()的返回值定义永远不会改变。这是一个非常安全的赌注,GDI是一成不变的。