一个变量的 C++ 多个定义

c++ multiple definitions of a variable

本文关键字:C++ 定义 一个 变量      更新时间:2023-10-16

我有 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
}

文件A.h:

#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'的多重定义"我不知道为什么,它似乎应该可以正常工作。

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

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

文件B.h

extern int wat;

文件B.cpp

int wat = 0;

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

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

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

我现在

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

你会得到多个定义,因为wat是在文件范围内声明的,并且在 2 个源文件中可见两次。

相反,应使变量声明extern,并在一个源文件中定义它。

extern int wat;  // In FileB.h
int wat;   // In FileB.cpp

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

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