2011-11-20 47 views
0

我正在使用gcc編譯一些.c文件。比方說,下面的話:鏈接錯誤:全局變量的多重定義

C文件是:

main.c 
tree.c 

頭文件是:

tree.h 

我已經宣佈了一些變量,如果看不到在tree.h。比方說,以下是值的全局varible分配:

int fanout = 5; 

早些時候,我一直保持main()功能tree.c文件。鏈接沒有問題。但是現在我想把主要功能分開。我剛剛在新創建的.c文件中移動了主要功能。現在的問題是,它 顯示鏈接錯誤:

main.o error: fanout declared first time 
tree.o error: multiple declaration of fanout. 

請讓我知道我可以擺脫這個問題的。

在此先感謝。

回答

3

當您在多個源文件中包含聲明並定義int fanout的頭文件時,將打破一個定義規則
按照ODR,在一個翻譯單元(頭文件+源文件)中只能有一個變量的定義。
要避免它,
您需要使用extern關鍵字。三個簡單的步驟:

  • 聲明extern變量

tree.h

extern int fanout; 
  • 定義變量

在c文件中的一個定義變量(tree.c)。

#include "tree.h" 
extern int fanout = 5; 
  • 使用可變

然後您在任何一個源文件要訪問fanouttree.h

main.c

#include "tree.h" 
int main() 
{ 
    fanout = 10; 
    return 0; 
} 
+0

順便說一句,我得到以下警告:**警告:「扇出」初始化並宣佈「的extern」 **你有任何想法,爲什麼會這樣? – thetna

+1

@thetna:你可能想檢查[this](http://stackoverflow.com/questions/8054847/declaration-versus-definition-in-c/8054893#8054893)我的答案。你可能也只是'int fanout = 5'在樹中。不包括前面的'extern',雖然這個警告只是地道警告,但是你可以擺脫這個警告。上面的答案中的用法是安全的,符合標準,鏈接的答案詳細解釋了這一點。 –