1. ホーム
  2. c++

[解決済み] なぜC++のインライン関数はヘッダーにあるのですか?

2022-05-13 23:25:30

疑問点

<サブタイトル NB これはインライン関数の使い方や動作についての質問ではなく、なぜそのようにするのかについての質問です。

クラスのメンバ関数の宣言では、関数の定義に inline として定義する必要はなく、実際に関数を実装するだけでよいのです。 例えば、ヘッダーファイルの中で

struct foo{
    void bar(); // no need to define this as inline
}

では、なぜクラス関数のインライン実装である があります。 をヘッダーファイルの中に置く必要があるのでしょうか?なぜインライン関数を .cpp ファイルに書くことができないのでしょうか?もし私がインラインの定義を .cpp ファイルにインライン定義を入れようとすると、次のようなエラーが発生します。

error LNK2019: unresolved external symbol 
"public: void __thiscall foo::bar(void)"
(?bar@foo@@QAEXXZ) referenced in function _main 
1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe 
: fatal error LNK1120: 1 unresolved externals

どのように解決するのですか?

の定義は inline 関数はヘッダファイルである必要はないのですが、そのため のような一つの定義ルール ( ODR ) インライン関数の場合、その関数を使用するすべての翻訳ユニットで、同一の定義が存在しなければなりません。

これを達成する最も簡単な方法は、ヘッダーファイルに定義を置くことです。

もし、関数の定義を単一のソースファイルに置きたいのであれば、関数を宣言してはいけません。 inline . 宣言されていない関数は inline と宣言されていない関数は、コンパイラがその関数をインライン化できないことを意味するものではありません。

関数を宣言すべきかどうか inline を宣言すべきかどうかは、通常、どのバージョンの 定義規則 のどのバージョンに従うのが最も理にかなっているかによって選択されるべきです。 inline を追加し、その後の制約によって制限されることは、ほとんど意味がありません。