C++ C++;结构的多重定义
我的头C++ C++;结构的多重定义,c++,struct,linker,header-files,object-files,C++,Struct,Linker,Header Files,Object Files,我的头util.hpp包含一个简单的结构: //util.hpp 结构点{ 浮动x; 浮动y; }; 两个cpp文件,我们称它们为a.cpp和b.cpp,都包括util.hpp: //a.cpp #包括“util.hpp” void funcA(浮点数x,浮点数y){ p点; p、 x=x; p、 y=_y; // ... } //b.cpp #包括“util.hpp” void funcB(浮动x,浮动y){ p点; p、 x=x; p、 y=_y; // ... } int main()
util.hpp
包含一个简单的结构:
//util.hpp
结构点{
浮动x;
浮动y;
};
两个cpp文件,我们称它们为a.cpp
和b.cpp
,都包括util.hpp
:
//a.cpp
#包括“util.hpp”
void funcA(浮点数x,浮点数y){
p点;
p、 x=x;
p、 y=_y;
// ...
}
//b.cpp
#包括“util.hpp”
void funcB(浮动x,浮动y){
p点;
p、 x=x;
p、 y=_y;
// ...
}
int main(){
// ...
}
当我分别编译a.cpp
和b.cpp
并将它们链接在一起时,我没有得到任何错误
为什么呢?既然我在两个文件中都包含了util.hpp
,那么我们对struct Point
不是有双重定义吗?
例如,当我向util.hpp
添加变量定义时,如下所示:
//util.hpp
结构点{
浮动x;
浮动y;
};
//新变量
int foo;
我在链接时遇到以下错误:
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
,类
,枚举
)只是编译器如何在内存中布局某些东西的“蓝图”,但不会导致代码或符号的生成
C++中,你也可以有成员函数和操作符和静态成员变量,但是这些技术在结构上不是结构/类的一部分,而是与结构/类一起使用,这样你就可以在全局上只定义一次。 就像
foo
的全局变量定义一样,如果在包含多次的文件中执行此操作,则不会起作用。但是你可以安全地多次申报
b、 o:(.bss+0x0):“foo”的多重定义
拥有
每次包含util.hpp时,您将再次定义全局变量foo,从而产生错误 在头文件中,只需声明它(
extern int foo;
)并在一个源文件中定义它
struct Point没有同样的问题,因为这是一个类型定义,而不是全局变量定义每次包含util.hpp时,都定义了全局变量foo@bruno是的,你是对的,“intfoo;”实际上是一个定义,只是把措辞从“声明”改为“定义”最后,我也回答了这个问题,而且允许使用多类型定义?链接器是否识别两个对象文件中的结构相同?@Kittion:不,在单个编译单元中不允许有多个类型定义。所发生的是,类型定义本身不会发出任何信息。因为没有发出任何信息,所以链接器没有什么可抱怨的。
// util.hpp
...
// New variable
int foo;