2011-05-05 38 views
0

我最近跑進Weird undefined symbols of static constants inside a struct/class描述的問題,我試圖通過添加定義爲相應的.cpp文件我所有的靜態常量類成員,使我的代碼符合規定,不只是那些導致鏈接器錯誤的那些。多個定義錯誤

在不斷的在多個編譯單元中使用的情況下,我收到多個定義錯誤,即使定義僅在compliation單位之一。

將初始化程序移動到定義可防止錯誤,但我寧願不這樣做。

對於什麼是值得的,雖然我目前在Visual Studio中工作,但此代碼需要在多個平臺上構建。

+6

你能告訴我們你的代碼嗎? – birryree 2011-05-05 14:59:37

+1

要添加@birryree所說的內容 - 請將您的代碼縮小爲仍然能夠顯示您的問題的最小完整示例。在減少代碼時,您會發現問題(並且您不需要我們),或者您可以很容易地發現問題(並且您會盡快得到答案)。簡短,自包含完整的示例程序,請參閱http://sscce.org。 – 2011-05-05 15:11:41

+0

@birryree和@Rob - 代碼與鏈接的問題和答案中的內容沒有顯着差異。 – IronMensan 2011-05-05 15:30:50

回答

1

如果啓用了語言擴展,Visual Studio將允許您在不定義實現文件的情況下使用靜態常量對象。不幸的是,當有明確的定義時,它會發出錯誤(如果我沒記錯的話)正確的C++程序。

嘗試禁用語言擴展。

+0

禁用語言擴展不是一種選擇,因爲Windows7 SDK沒有它們就不能編譯。然而,http://msdn.microsoft.com/en-us/library/34h23df8(v=VS.80).aspx中描述的selectany選項似乎有訣竅。 – IronMensan 2011-05-05 16:06:04

0

我想,如果你希望你的代碼在多個平臺上工作,你應該將初始化的定義(在.cpp文件)。雖然它可能在一個或多個編譯器上工作,但不要依賴它來進行移植。

3

靜態成員變量在類體中聲明並在類體外定義一次。這樣做的一般方法是:

class MyClass 

{ 
    static int i; 

}; 

int MyClass::i = 0; 

該定義在C++源文件中完成,而不是在頭(.h)中完成。如果這樣做,變量將定義包含頭文件的任何地方。看來你正面臨着同樣的問題。

+0

我試圖在問題中明確指出這不是問題,因爲包含「相應的.cpp」和「定義僅在其中一個編譯單元中」 – IronMensan 2011-05-05 15:29:26

1

據對http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio的職位之一這實際上可能是一個Visual Studio的錯誤,導致您無法使用初始化的那種形式。

不幸的是我認爲你可能會被困在源文件中進行初始化以保持可移植性。

我創建了一個簡單的例子,在g ++ 4.2中編譯和鏈接很好。

+0

是否知道它是否已在更高版本的Visual工作室?我仍然在使用2005. – IronMensan 2011-05-05 15:33:56