23

我有 4 个文件(2 个标题和 2 个代码文件)。文件A.cpp、文件A.h、文件B.cpp、文件B.h

文件A.cpp:

#include "FileA.h"

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

void hello()
{
    //code here
}

文件AH:

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

#endif /* FILEA_H_ */

文件B.cpp:

#include "FileB.h"

void world()
{
    //more code;
}

文件B.h:

#ifndef FILEB_H_
#define FILEB_H_

int wat;
void world();


#endif /* FILEB_H_ */

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

4

5 回答 5

38

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

要修复,请使用以下命令:

文件B.h

extern int wat;

文件B.cpp

int wat = 0;

这个 ( extern) 告诉编译器该变量wat存在于某个地方,并且它需要自己找到它(在这种情况下,它位于FileB.cpp

于 2012-06-17T15:01:43.090 回答
15

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

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

于 2012-06-17T15:02:07.383 回答
3

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

于 2012-06-17T15:01:44.427 回答
2

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

相反,声明变量extern并将其定义在一个源文件中。

extern int wat;  // In FileB.h

int wat;   // In FileB.cpp
于 2012-06-17T15:01:23.517 回答
0

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

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

于 2012-06-17T15:00:52.573 回答