2016-09-27 41 views
1

基本上我想在另一個文件的std :: array中使用一個全局常量。在std :: array中使用的C++ 11中的全局常量

我知道這個全局變量問題已經在這裏被多次詢問了。例如,這樣一句: Defining global constant in C++

和個人我更喜歡使用方法5或6:

5:const int的GLOBAL_CONST_VAR = 0xFF的;

6:extern const int GLOBAL_CONST_VAR;並在一個源文件中const int GLOBAL_CONST_VAR = 0xFF;

我的項目需要很多常量,比如太陽常數。有些用於std :: array,例如nvegetation_type,nrock_type。

我以前使用方法5,所以只有一個頭用於所有其他源文件。但多個定義問題出現類似於: Multiple definition and header-only libraries 這裏: Why aren't my include guards preventing recursive inclusion and multiple symbol definitions?

但這樣子在我的Visual Studio C++項目不是一個問題,我不知道爲什麼呢。我在Linux下使用makefile並編譯。

然而,當我使用方法6和C++ 11作爲

extern const int nvegetation_type ; 
const std::array< double, nvegetation_type > some_variable 
= { { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 
     0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1} }; 

我將獲得像誤差限定在其他源頭文件數組:

error C2065: 'nvegetation_type': undeclared identifier. 

我假定當我使用頭/源方法,我不能直接交叉引用全局變量,至少對於std :: array。 我讀了一些類似的鏈接,但沒有人提到過這個(也許我的搜索是不吉利的)。 http://www.learncpp.com/cpp-tutorial/42-global-variables/ 那麼解決方案是什麼?

+0

我不知道你在問什麼。 –

+0

我會想這個錯誤是'未定義的標識符'而不是'未聲明的標識符'? – lfgtm

+0

它確實看起來像一個奇怪的診斷(即使問題不是聯繫,所以你建議的選擇不太對) –

回答

1

感謝所有的意見和解答。我想我已經用你的幫助修復了它。

原諒我,我沒有提供足夠的細節。我沒有提出我遇到的問題的一個更簡單的演示。通常我會創建一個測試項目。

所以最終的解決方案是混合的。 如上所示,std :: array需要在編譯階段知道常量值。我在文章中提到的方法5是理想的解決方案。在這種情況下,只需要一個頭文件。它將被用在std :: array中。這種方法的缺點是它會創建頭文件的多個副本。

對於其他全局變量,可以使用方法6(經典的頭文件和源文件)來定義它們。

因此,我將全局變量分爲兩類,分別使用方法5和6來定義它們。它的工作!

1

隨着

extern const int nvegetation_type; 

你說於某處,被定義常量編譯器不知道在編譯階段價值的編譯器。

,編譯器必須知道常數的精確值,在編譯階段,以下指令

const std::array< double, nvegetation_type > some_variable 

所以錯誤。

一個簡單的解決方案可以使用一個頭文件,你可以用它的值聲明const。

const int nvegetation_type = <value>; 

(甚至constexpr,在這方面採取你所標記的問題作爲c++11計數)在需要的地方每CPP/h的文件,包括它。

缺點是,如果你在很多cpp文件中包含這個頭文件,你的程序定義了很多nvegetation_type常量;都具有相同的價值,但有很多副本。

在這種情況下,你可以在頭

extern const int nvegetation_type = <value>; 

添加extern和,只在一個CPP文件,添加

const int nvegetation_type; 
+0

那麼解決方案是什麼? – Chang

+0

@長寮 - 答案改進 – max66

+0

謝謝,這是一個非常明確的解釋。但是,當我測試最後一部分時,事實證明 在這種情況下,您可以在標頭中添加extern extern const int nvegetation_type = ; ,並且只在一個cpp文件中添加 const int nvegetation_type; 將導致多重定義問題,所以我刪除.cpp文件,它的工作。 @ max66 – Chang