C++ 结构的多重定义
C++ Multiple Definition of Struct
我有 header util.hpp
包含一个简单的结构:
// util.hpp
struct Point {
float x;
float y;
};
两个cpp文件,我们称它们为a.cpp
和b.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.cpp
和 b.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
这对我来说很有意义,但为什么结构没有发生同样的错误?
类型定义(struct
、union
、class
、enum
)只是编译器如何布局的一种"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 没有同样的问题,因为这是一个类型定义,而不是全局变量定义
我有 header util.hpp
包含一个简单的结构:
// util.hpp
struct Point {
float x;
float y;
};
两个cpp文件,我们称它们为a.cpp
和b.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.cpp
和 b.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
这对我来说很有意义,但为什么结构没有发生同样的错误?
类型定义(struct
、union
、class
、enum
)只是编译器如何布局的一种"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 没有同样的问题,因为这是一个类型定义,而不是全局变量定义