2013-05-31 140 views
2

作为一个更大的项目(FF的ActiveX插件的Mozilla Firefox)有此代码段的一部分:奇怪的错误C2065:“错误”:未声明的标识符

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

当我建立在VS2012我得到“错误C2065:“错误”:未声明的标识符“ 错误是在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 
... 

奇怪的是,如果我替换ERROR(只是看它是否建立OK)与NULLREGION或SIMPLEREGION(它们是ma交叉在同一个文件中,只有两行在违规之下)如果以上声明,代码生成OK。当我使用ERROR时,代码不会生成。 上面定义的错误宏是否可能被某些关键字或另一个宏或Visual Studio中的某些类掩盖了?

+0

尝试在调试器中查看当前的ERROR含义。它可能被掩盖了。 – akalenuk

+0

1)你有什么标题? 2)可能是你的'ERROR'定义在'#ifdef SOME_FLAG' ...'#endif'块上? – eraxillan

+2

确定'#undef ERROR'后面的任何位置?可以在文件本身或包含文件后包含行吗? – Jimbo

回答

3

这里的问题是ERROR实际上出现在编译错误信息中。这是不应该的,预处理器应该为0

所以地方你WINDOWS.H后执行#included .h文件取代它,一些程序员花10秒快捷方式宏的名称冲突问题,并写这个:

#undef ERROR 

你需要找到该行并将其删除。这可能是困难的,并且很容易给你一个维护头痛的问题,因为这是一个你不拥有的文件,将来可能会更新,迫使你一次又一次地进行修改。另一种方法是自己重新定义它:

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

仍然给你一个维护的问题,需要你采取打赌CombineRgn的返回值定义()是永远不会改变。这是一个非常安全的赌注,GDI陷入困境。

+0

是的,我在许多地方发现**#undef ERROR **。所以我用我自己的宏。 BTW GDI_ERROR不会这样做,已经使用过。感谢您的答复! – user1523271

相关问题