2011-07-13 47 views
8

我在其中一個h文件中包含windows.h(爲了使用CaptureStackBackTrace),在Visual-Studio項目中。起初,由於使用最小/最大std方法以及windows.h中的宏具有相同的名稱,但由於我在其他SO帖子中讀到,似乎可以通過#define NOMINMAX來解決這個問題。 (我說「似乎」,因爲我不能確定,直到我的整個項目再次確定)。包括windows.h與本地變量名稱衝突

問題是現在有些局部變量名稱會破壞構建。行:

int grp1; 

一個類的方法中,將導致以下錯誤:

error C2143: syntax error : missing ';' before 'constant' 

而如果我改變變量名grp1_ cpp文件編譯OK。

當然,我可以更改變量名稱,但是我有一種感覺,我做錯了什麼 - 是嗎?或者這是一個已知的問題,包括windows.h?除了更改變量名稱之外,還有其他更優雅的解決方案嗎?

回答

10

dlg.h包含行

#define grp1  0x0430 

你可以通過定義WIN32_LEAN_AND_MEAN排除。

+2

如果它在你打算分發的頭文件中,那麼避免命名可能是個好主意在用戶需要'dlgs.h'的情況下進行碰撞。否則,您應該爲所有項目添加'WIN32_LEAN_AND_MEAN'!節省一些編譯時間,並擺脫一些像這樣的煩人的事情。 –

1

那麼,GRP1在DLGS.H定義爲這樣:

#define grp1  0x0430 

和DLGS.H被包括在WINDOWS.H,因此衝突。您可以#undef grp1之後#include <windows.h>。不是最漂亮的網站,但如果只包含一次windows.h,則可以將這些修補程序保留在一個地方。

3

在某種程度上,它是所有庫標題的問題。對於(標準庫的)實現,C和C++保留名稱以_開頭。其他圖書館是獨立的。人們會希望namespace,或者如果庫必須在C中編譯,某種命名約定(如前綴),但Windows和Posix都不會這樣做。 (在早期,X的頭文件包含一個#define String,這導致了與其他庫無法結束的問題。)

最後,沒有任何好的解決方案。你只需等到你被它擊中,然後改變你的函數的名字。 (windows.h特別糟糕,因爲「函數中大部分函數」其實都是宏,並且不服從範圍。)