2013-05-31 169 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

相關問題