関数がヘッダファイルで定義されている場合、インラインキーワードは意味がありますか?
です。
main.cppに:
#include "a.h"
int main(int argc, char** argv){
A obj;
obj.f();
a();
b();
return 0;
}
ああ:
#ifndef A_HEADER
#define A_HEADER
class A{
public:
void f();
};
void a(){
}
void b();
void A::f(){
}
#endif
次のプロジェクトは、インラインキーワードの省略のMSVCとg ++の両方にリンカエラーが生成されます
b.cpp:
#include "a.h"
void b(){
A obj;
obj.f();
a();
}
(Qtの4ビルドシステム用)* .PROファイル:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
HEADERS += a.h
SOURCES += b.cpp main.cpp
コンパイル出力:
cl。exeファイル:
main.obj : error LNK2005: "void __cdecl a(void)" ([email protected]@YAXXZ) already defined in b.obj
main.obj : error LNK2005: "public: void __thiscall A::f(void)" ([email protected]@@QAEXXZ) already defined in b.obj
debug\1234.exe : fatal error LNK1169: one or more multiply defined symbols found
グラム++:今
debug/main.o: In function `Z1av':
D:\c++\1234/a.h:6: multiple definition of `a()'
debug/b.o:D:\c++\1234/a.h:6: first defined here
debug/main.o:D:\c++\1234/a.h:11: multiple definition of `A::f()'
debug/b.o:D:\c++\1234/a.h:11: first defined here
collect2: ld returned 1 exit status
make[1]: *** [debug/1234.exe] Error 1
make: *** [debug] Error 2
、なぜあなたはこれが起こると思いますか?コンパイラは、コンパイル時にヘッダファイルの内容をの内容を* .cppファイルに挿入するためです。関数は "インライン"ではないので、その名前はリンカーに知らされ、それぞれ.obj/ .oファイルはA::f()
とa()
という固有のコピーを取得します。リンカはあなたが使用するはずのものを知らず、不平を言うでしょう。関数をインライン化すると、すべて正常に動作します。
しかし、テンプレートは別の話です。
'inline'はコンパイラにとっては「オプション」なので、*インラインには何もありません**キーワードは単なる**インライン化できるコンパイラ**です。 –
@TonyTheLion:私は彼が実際のインライン化に本当に関わっているのではなく、C++で 'inline'を本当に使用していると思います。複数の翻訳単位で表示されている場合、ODRを破ることはありません。 –
@TonyTheLion:**インラインキーワードを指定する**の場合があります。私の答えを見てください。 – SigTerm