我做了一個簡單的實驗,一個「.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++要求函數被編譯」就好像「它被內聯;」,呃,考慮一個遞歸函數。 ;-) –