c ++变量的多个定义

时间:2012-06-17 14:56:37

标签: c++ compiler-errors

我有4个文件(2个标题和2个代码文件)。 FileA.cpp,FileA.h,FileB.cpp,FileB.h

FileA.cpp:

#include "FileA.h"

int main()
{
    hello();
    return 0;
}

void hello()
{
    //code here
}

FileA.h:

#ifndef FILEA_H_
#define FILEA_H_
#include "FileB.h"
void hello();

#endif /* FILEA_H_ */

FileB.cpp:

#include "FileB.h"

void world()
{
    //more code;
}

FileB.h:

#ifndef FILEB_H_
#define FILEB_H_

int wat;
void world();


#endif /* FILEB_H_ */

当我尝试编译(使用eclipse)时,我得到了“wat'的多重定义” 我不知道为什么,似乎应该可以正常工作。

5 个答案:

答案 0 :(得分:26)

我不打算包含所有细节,但您在编译uint中定义了两次全局变量wat

要修复,请使用以下内容:

<强> FileB.h

extern int wat;

<强> FileB.cpp

int wat = 0;

这个(extern)告诉编译变量wat存在某处,并且它需要在它上面找到它(在这种情况下) ,它在FileB.cpp

答案 1 :(得分:7)

不要在标头中声明变量。 #include从字面上将文件的内容复制并粘贴到另一个文件中(即,#include "FileB.h"的任何文件都会将FileB.h的内容直接复制到其中,这意味着int wat在每个执行#include "FileB.h")的文件中定义。

如果要从FileA.cpp访问wat,并在FileB.cpp中声明它,可以在FileA.cpp中将其标记为extern

答案 2 :(得分:2)

您获得了多个定义,因为wat在文件范围内声明,并且在2个源文件中可见两次。

相反,请创建变量声明extern并在完全一个源文件中定义它。

extern int wat;  // In FileB.h

int wat;   // In FileB.cpp

答案 3 :(得分:1)

我现在找到了答案(我猜一个接一个地查看文件) 问题是编译器创建了一个具有wat定义的FileB.o, 然后它尝试使用FileA.cpp编译FilB.o,而FileA.h包含FileB.h,它现在也有一个wat的定义。

答案 4 :(得分:-1)

该wat变量声明是一个属于cpp文件的定义。就像你将函数体放入标题一样。

你需要在wat声明之前放置extern并将你当前的声明复制到其中一个cpp文件中。