2009-07-03 100 views
5

很難想出這個問題的正確標題。無論如何...其他的庫#define命名衝突

我目前正在爲在我的遊戲SDL工作。我完成了軟件繪圖,並且正在開始OpenGL的一部分,當出現一個奇怪的錯誤時。我包含了「SDL/SDL_opengl.h」頭文件並進行了編譯。它會拋出「錯誤C2039:'DrawTextW':不是'GameLib :: FontHandler'的成員,這是一個足夠簡單的錯誤,但我沒有任何名爲DrawTextW的東西,只有FontHandler :: DrawText。我搜索DrawTextW並在頭文件「WinUser.h」的#define調用中找到它!

//WinUser.h 
#define DrawText DrawTextW 

顯然,它取代了我和DrawTextW DrawText的!我怎樣才能阻止它溢出到我的代碼呢?

改變我自己的函數的名字是一件小事,但這樣的命名衝突看起來非常危險,我真的很想知道如何避免它們在一起。

乾杯!

回答

9

你有幾個選項,所有這些都鬧心。

  • 在自己的代碼
  • 添加#undef DrawText不包括windows.h。如果另一個圖書館爲您提供,請不要直接包含該圖書館。相反,將它包含在一個單獨的.cpp文件中,然後可以在其標題中公開自己的包裝函數。
  • 重命名您自己的DrawText

如果可能,我通常會選擇中間選項。 windows.h在許多其他方面表現不佳(例如,除非啓用Microsoft專有的C++擴展,否則它實際上不會編譯),所以我只是避免它像鼠疫一樣。如果我可以提供幫助,它不會包含在我的文件中。相反,我編寫了一個單獨的.cpp文件來包含它並公開我需要的功能。

此外,隨時提交它作爲connect.microsoft.com上的錯誤和/或反饋。 Windows.h是一個設計錯誤的頭文件,如果人們引起微軟的注意,他們有一天可能會修復它。

好消息是,windows.h只有標題,表現這很糟糕。其他頭文件通常會嘗試在它們的宏前添加一些特定於庫的名稱以避免名稱衝突,它們嘗試避免爲常見名稱創建宏,並且儘量避免使用超出必要的宏。

5

這是一個不幸的副作用#include ing <windows.h>。您實際上並不使用Windows' DrawText()在你的程序的任何地方假設,這是完全安全的#undef立刻之後:

// wherever you #include <windows.h>, or any other windows header 
#include <windows.h> 
#undef DrawText 
+0

謝謝!它現在編譯好了。確實有一個令人討厭的副作用。看起來好像SDL_opengl.h包含了windows.h,但是#undef是它的工作。爲了避免這個問題,windows.h的寫法可能不同嗎? – Zoomulator 2009-07-03 20:06:10

+1

它可以。但這需要微軟關心。 – jalf 2009-07-03 20:22:40

4

有避免這個問題沒有通用的方法 - 一旦你使用#include頭文件預處理器,它可以重新定義它喜歡的任何名稱,並且你無能爲力。你可以#undef這個名字,但是假設你知道這個名字是第一個被定義的。

0

只是#undef你不想要的符號。但是,請確保您有windows.h,做這一點,你有SDL之前:

#include <windows.h> 
#undef DrawText 

#include <SDL/SDL_opengl.h>