C++ 结构的多重定义

C++ Multiple Definition of Struct

我有 header util.hpp 包含一个简单的结构:

// util.hpp

struct Point {
  float x;
  float y;
};

两个cpp文件,我们称它们为a.cppb.cpp,都包含util.hpp:

// a.cpp

#include "util.hpp"

void funcA(float _x, float _y) {
  Point p;
  p.x = _x;
  p.y = _y;
  // ...
}
// b.cpp

#include "util.hpp"

void funcB(float _x, float _y) {
  Point p;
  p.x = _x;
  p.y = _y;
  // ...
}

int main() {
  // ...
}

当我分别编译 a.cppb.cpp 然后 link 一起编译时,我没有出错。

这是为什么?因为我在两个文件中都包含 util.hpp,所以我们不会对 struct Point 进行双重定义吗? 例如,当我像这样向 util.hpp 添加变量定义时:

// util.hpp

struct Point {
  float x;
  float y;
};

// New variable
int foo;

我在 linking:

时收到以下错误
g++ a.o b.o -o test -O0
b.o:(.bss+0x0): multiple definition of `foo'
a.o:(.bss+0x0): first defined here

这对我来说很有意义,但为什么结构没有发生同样的错误?

类型定义(structunionclassenum)只是编译器如何布局的一种"blueprint"内存中的某些东西,但不会自行生成代码或符号。

在 C++ 中,您还可以拥有成员函数和运算符以及 静态成员变量 ,但是这些在技术上不是 的一部分 struct/class 但 附带 struct/class,因此您只能在全局范围内定义它们一次。

就像 foo 的全局变量定义一样,如果在包含多次的文件中完成,这将不起作用。但是您可以多次安全地声明它们。

b.o:(.bss+0x0): multiple definition of `foo'

// util.hpp
...
// New variable
int foo;

每次包含 util.hpp 时,您都会再次 define 全局变量 foo,从而产生错误

在头文件中声明它(extern int foo;)并在一个源文件中定义它

struct Point 没有同样的问题,因为这是一个类型定义,而不是全局变量定义