Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;结构的多重定义_C++_Struct_Linker_Header Files_Object Files - Fatal编程技术网

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;