2011-12-02 22 views
2

我剛剛從WinXP升級到Seven,我必須將Windows SDK添加到我的項目中才能編譯。刪除C++中名稱衝突的最佳方法

到目前爲止這麼好,但我的第二個項目碰到了一個障礙,'PlayerState'在我的項目中用作類,在Windows SDK(effects.h)中用作枚舉,這顯然會產生錯誤(錯誤C2011: 'PlayerState':'struct'類型重定義)。

解決此問題的最佳方法是什麼?

我已經想到了:

  • 重命名,但我會打破命名約定(它確實是球員的狀態')
  • 把它在一個命名空間,但後來我應該把每這意味着大量的工作

是否有任何其他方式(可能是一個特殊的MSVC 2010 vay)說排除該文件或某種'undefine'的枚舉或別的東西?

[編輯]答案是,大聲清楚,名人! +1,謝謝大家!

+2

是不是創建命名空間來防止這樣的問題?儘管這需要更多的工作,但我建議這樣做,因爲它似乎是正確的方向。 – slayton

回答

7

命名空間,這就是它畢竟存在的地方。分組並避免名稱衝突。如果你通過你的代碼庫並把所有東西放在一個名字空間中,它不會受到傷害。這就是你應該一直在做的事情。

2

顯而易見的答案是:爲所有項目使用自定義名稱空間。它應該有一個唯一的名稱,如果你更喜歡命名空間的深度。

3

把它在一個命名空間,但後來我應該把每個班級的 命名空間,這意味着工作的地塊

好,堅韌,基本上是這樣。無論如何,類名應該在之間。如果你沒有把它們放在命名空間中,那麼這是不可持續的,這只是偷工減料,這就是原因。

2

我把它放在一個命名空間。

不,這並不意味着您需要將所有類放入命名空間中。只是說

using myns::PlayerState; 

在適當的時候,或者如果衝突仍然發生在那個時候,

typedef myns::PlayerState myPlayerState; 

如果你真的想要去的快速和骯髒的,做一個

#define PlayerState MyPlayerState 

包括<windows.h>