为什么一个成员函数只存在一次,即使在一个包含多个 .h 文件中定义?
Why does a member function exist only once even defined in one multiple included .h file?
我只是想知道编译器如何处理仅在包含文件中声明和定义成员函数但此 .h 文件在不同源代码中多次包含而没有链接器关于 multiple definition of ...
.
foo_1.h
:
class foo
{
public:
auto in_include() -> void { printf( "in in_include()\n" ); }
foo();
};
foo_1.cpp
:
#include <stdio.h>
#include "foo_1.h"
foo::foo()
{
printf( "in foo()\n" );
in_include();
}
最后 foo_main.cpp
:
#include <stdio.h>
#include "foo_1.h"
int main()
{
foo fooObject;
}
这些 MCVE 编译 和 链接正常并产生预期的输出:
in foo()
in in_include()
BUT,当我添加 foo_1.h
这一行时 int globar_var;
然后链接器抱怨 [正如我所料]:
/tmp/ccfjJJAT.o:(.bss+0x0): multiple definition of `globar_var'
/tmp/cciob9sM.o:(.bss+0x0): first defined here
我不认为是重复的,因为我问为什么链接器不抱怨。另一个问题或多或少是在问为什么可以在头文件中定义一个函数。
Class 在 class 声明中使用主体定义的成员函数自动成为内联函数,因此即使多次编译定义也可以。您可以使用 inline
关键字为非 class 函数获得相同的结果。
这在实践中如何实现取决于编译器 - 它实际上可以在每次调用时内联代码(想想复制和粘贴),或者它可以安排一些我不完全理解的链接器魔法防止碰撞。
我只是想知道编译器如何处理仅在包含文件中声明和定义成员函数但此 .h 文件在不同源代码中多次包含而没有链接器关于 multiple definition of ...
.
foo_1.h
:
class foo
{
public:
auto in_include() -> void { printf( "in in_include()\n" ); }
foo();
};
foo_1.cpp
:
#include <stdio.h>
#include "foo_1.h"
foo::foo()
{
printf( "in foo()\n" );
in_include();
}
最后 foo_main.cpp
:
#include <stdio.h>
#include "foo_1.h"
int main()
{
foo fooObject;
}
这些 MCVE 编译 和 链接正常并产生预期的输出:
in foo()
in in_include()
BUT,当我添加 foo_1.h
这一行时 int globar_var;
然后链接器抱怨 [正如我所料]:
/tmp/ccfjJJAT.o:(.bss+0x0): multiple definition of `globar_var'
/tmp/cciob9sM.o:(.bss+0x0): first defined here
我不认为是重复的,因为我问为什么链接器不抱怨。另一个问题或多或少是在问为什么可以在头文件中定义一个函数。
Class 在 class 声明中使用主体定义的成员函数自动成为内联函数,因此即使多次编译定义也可以。您可以使用 inline
关键字为非 class 函数获得相同的结果。
这在实践中如何实现取决于编译器 - 它实际上可以在每次调用时内联代码(想想复制和粘贴),或者它可以安排一些我不完全理解的链接器魔法防止碰撞。