2011-11-20 49 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',虽然这个警告只是地道警告,但是你可以摆脱这个警告。上面的答案中的用法是安全的,符合标准,链接的答案详细解释了这一点。 –