2013-02-26 28 views
1

我玩弄多個文件在C++中,我已經用下面的例子來的頭與不編譯:恰當使用C++

的main.cpp

#include <iostream> 
#include "const.hpp" 

using namespace std; 

int main() 
{ 
    extern double var; 
    var = 5; 
    cout << var << endl; 

    return 0; 
} 

fct.cpp

#include <iostream> 
#include "const.hpp" 

using namespace std; 

void func() 
{ 
    extern double var; 
    cout << var << endl; 

} 

const.hpp

#ifndef CONST_H 
#define CONST_H 

double var; 

#endif 

我的程序不能編譯,因爲顯然有var的多重定義。我正確地假設,基於這個例子,頭文件是而不是打算用於聲明變量,如我在上面的例子中?

相反,正確的步驟是聲明中的所有變量.cpp文件,並使用頭來告訴.cpp文件中包含外部(的extern)變量中的每個(相關的)翻譯單元?

編輯:是否正確,上面的規則是一個exeption處理常量變量(常量),應該在頭中定義?

+0

它編譯,它不鏈接... – 2013-02-26 14:41:36

回答

2

我正確地認爲,基於這個例子,頭文件不打算用於聲明變量,如我在上面的示例中所示?

頭文件是用於聲明變量,但你的頭文件定義具有外部鏈接的全局變量,但導入多次。鏈接器然後合理地抱怨多重定義的符號。

相反,正確的過程是在.cpp文件中聲明所有變量,並使用標題告訴每個(相關)翻譯單元.cpp文件包含外部(extern)變量?

是的,但你不會宣佈.cpp文件中的全局變量,而是提供了一個定義他們。

const.hpp

#ifndef CONST_H 
    #define CONST_H 

    // ... 

    extern double var; 
// ^^^^^^ 

    #endif 

globals.cpp(可以是任何其他.cpp文件,只要它是只有一個

// ... 

    double var; 

另外,如果你想知道爲什麼你有原因警衛在這種情況下不會保護你,this可能會幫助你。

上述規則的異常處理常量變量(const)時應該在頭文件中定義它是否正確?

從某種意義上說,是的。限定爲const的全局變量默認具有內部聯接,這意味着每個轉換單元將收到該變量的一個專用副本。所以即使變量的定義被多個翻譯單元包含,鏈接器也不會抱怨多重定義的符號。

4

double var;是一個定義 - 包括在多個文件中的頭將違反一個定義規則。如果你想要一個全局的(想想兩次),你必須聲明它在頭 - extern double var;並將定義移動到一個實現文件。

+1

甚至更​​好:停止使用全局變量。他們只會給你帶來痛苦和絕望。 – 2013-02-26 14:18:28