奇怪的错误 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:“MIIM_STRING”:未声明的标识符
错误>fun.cpp(29):错误C2065:'Llist_url':未声明的标识符1>fun.cpp(30):[关闭]
C语言错误 error C2059: 语法错误:“)”以及 错误error C2065: “sockaddr”: 未声明的标识符