2012-10-15 91 views
2

我已經使用OpenGL在C++中編寫了一個簡單的程序。我需要的是在兩個文件中有幾個全局變量 - main.cppfuncs.cpp - 它們將保持相同的值。當我試圖在funcs.h(其中也包括在main.cpp中)申報這些變量,我得到這個錯誤:全局變量和鏈接器錯誤

1>main.obj : error LNK2005: "int myVariable" ([email protected]@3HA) already defined in funcs.obj 
1>Path to my program : fatal error LNK1169: one or more multiply defined symbols found 

這是相當明顯的,因爲它會在funcs中創建變量。 cpp和main.cpp。當我試圖用這種方式聲明變量時:

//funcs.cpp 
int myVariable; 

//main.cpp 
int myVariable; 

而且它們都是全局的,我得到的錯誤與上面完全相同。我感興趣的是,兩個變量在相反的文件中都是不可見的,所以爲什麼變量具有相同的名稱是錯誤的?據我所知,在main.cpp和func.cpp中沒有可能參考funcs.cpp中的myVariable。我的第二個問題是 - 解決我的問題的最好方法是什麼,因爲我所做的只是重命名了其中的一些變量(其中有很多),並在funcs.cpp中添加了函數,如setNewValue(int newValue),我可以從main調用它們。 cpp但說實話 - 我並不以此爲榮。

我使用Microsoft Visual Studio 2012,C++/OpenGL。

回答

6

使用C++:

  • 如果你想份額兩個文件之間的全局變量,然後在其中一個文件中聲明它,例如main.c,就像你現在正在做的那樣,在另一個文件中聲明變量爲extern。這樣,變量就被聲明在一個文件中,並且相同的變量可以用在其他文件中,並且對於該變量的多個定義你不會有問題。

  • 如果你想在每個文件中使用全局變量具有相同的名稱,使得文件不共享這個變量,然後使用匿名命名空間限制變量的可見性:

    namespace 
    { 
        int myVariable; 
    
        // ... 
    

標準C:爲了完整起見,如果你正在使用的,而不是使用名稱空間的限制變量的可見性標準C,可以使用static關鍵字:如上所述,如果你想在每個文件中使用一個同名的全局變量,而你不要想要文件共享那個變量,那麼你需要聲明它們爲static。這限制了他們對當前文件的可見性。

在C.

同樣分享全球使用 extern作品
+2

作爲'static'的替代方法,您也可以使用匿名命名空間。 –

+0

@TomW謝謝,我又錯過了_C++ _標籤並假定_C_;將編輯 – pb2q

+0

哈哈就這麼簡單:D非常感謝。有時候,當我想到很難做到的事情時,我忘記了最簡單的解決方案:P – Blood

2

默認情況下,全局範圍的變量可用於所有其他翻譯單元;其他翻譯單元只需要使用extern int myVariable來訪問該全局變量。因此,通常要創建一個對每個單元都可見的全局變量,將extern聲明放在頭文件中,並將變量聲明本身放在一個.c/.cpp文件中。

如果你想使一個變量訪問僅在該文件中,在全局範圍內聲明它static

static int myVariable; 
0

這是不合法的,因爲這將有可能爲一些假設的第三個文件,以使用extern聲明訪問myVariable。此時,編譯器不知道extern聲明是否引用了funcs.cpp中的變量或main.cpp中的變量。