我做了一个简单的实验,一个“.h”头文件使用一个类定义和功能可按定义如下:头文件包含函数体,会导致重复的定义?
$cat testInline.h
#pragma once
class C{
public:
void f(){}
};
void g(){}
然后2对用户来说,这.h文件中的:
$cat use01.cpp
#include"testInline.h"
void g01(){
g();
C obj1;
obj1.f();
}
$cat use02.cpp
#include"testInline.h"
int main(){
g();
C obj2;
obj2.f();
return 0;
}
我编在一起,并得到一个错误:
$g++ use01.cpp use02.cpp
duplicate symbol __Z1gv in:
/var/folders/zv/b953j0_55vldj97t0wz4qmkh0000gn/T/use01-34f300.o
/var/folders/zv/b953j0_55vldj97t0wz4qmkh0000gn/T/use02-838e05.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
看起来很奇怪:我用“曾经的#pragma”,我仍然无法从报告克(重复的定义停止编译)(__ Z1gv如名称重整)
然后我改性testInline.h->克()的定义是这样的:
inline void g(){}
好了,它编译。是不是在C++中,“内联”关键字基本上是无用的,因为编译器会决定它是否将内联函数?
而且,为什么具有.h文件中的代码的C :: f()不会报告重复,而C风格的函数g()呢?为什么C类不必为其“f()”函数添加“内联”,而g()必须使用“内联”?
希望我已经说清楚了我的问题。谢谢你的帮助。
“C++要求函数被编译”就好像“它被内联;”,呃,考虑一个递归函数。 ;-) –