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

Posted

技术标签:

【中文标题】奇怪的错误 C2065:“错误”:未声明的标识符【英文标题】:Strange Error C2065: 'ERROR' : undeclared identifier 【发布时间】:2013-05-26 22:40:57 【问题描述】:

作为一个更大的项目(Mozilla Firefox 的 ff activex 插件)的一部分,有这个代码 sn-p:

if (CombineRgn(hrgnClip, hrgnClip, hRGN, RGN_AND) != ERROR)

        ::InvalidateRgn(m_hWndParent, hrgnClip, fErase);

当我在 VS2012 中构建时,我得到“Error C2065: 'ERROR': undeclared identifier” 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
...

奇怪的是,如果我在 if 语句,代码构建成功。当我使用 ERROR 时,代码不会构建。 上面定义的 ERROR 宏是否有可能被某个关键字或另一个宏或 Visual Studio 中的某个宏所掩盖?

【问题讨论】:

尝试在调试器中查看当前错误的含义。它确实可以被掩盖。 1) 你包含哪些标题? 2) 可能是您的ERROR 定义在#ifdef SOME_FLAG...#endif 块上? #undef ERROR 是否出现在定义之后的任何位置?可能在文件本身中或包含行后包含的文件? 【参考方案1】:

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

所以某处在你在 windows.h 之后#include 的 .h 文件中,一些程序员使用了 10 秒的快捷方式来解决宏名称冲突问题并写下:

  #undef ERROR

您需要找到该行并将其删除。这可能很困难,而且可能会给您带来维护上的麻烦,因为这是您不拥有的文件,并且将来很可能会更新,从而迫使您一遍又一遍地进行更改。另一种方法是自己重新定义:

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

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

【讨论】:

是的,我在很多地方都发现了 #undef ERROR。所以我使用了自己的宏。 BTW GDI_ERROR 不行,已经用过了。感谢您的所有回复!

以上是关于奇怪的错误 C2065:“错误”:未声明的标识符的主要内容,如果未能解决你的问题,请参考以下文章

“错误 C2065:'ON_WM_THEMECHANGED':未声明的标识符”[关闭]

错误 C2065:“IOCTL_NDISUIO_OPEN_DEVICE”:未声明的标识符

错误 C2065:“DWORD_PTR”:未声明的标识符

错误 C2065:“MIIM_STRING”:未声明的标识符

错误>fun.cpp(29):错误C2065:'Llist_url':未声明的标识符1>fun.cpp(30):[关闭]

C语言错误 error C2059: 语法错误:“)”以及 错误error C2065: “sockaddr”: 未声明的标识符