私は Stroustrup の本で次の行を読みまし た。
「すべての翻訳単位でインライン関数を定義する必要がある」という根拠は何ですか? 私はそれを間違って理解していますか?私は、1つ(定義を含む)を除くすべての翻訳単位で他の関数宣言を使用しても問題ないことを知っています。
歴史的に、C++ 言語コンパイラは独立した翻訳の原則に基づいて構築されていました。各翻訳単位は完全に独立してコンパイルされます (そしてリンカーだけがプログラム全体を認識します)。
このような状況では、インライン化を実行するために、コンパイラは、関数が呼び出された各翻訳単位で関数のソース コードを確認できる必要があります。そのためには、各翻訳単位で定義する (つまり、本体で宣言する) 必要があります。
インライン関数は複数の翻訳単位で複数回定義できるため、定義されていない場所で使用された場合、リンカーは使用する定義を認識できません。(これは明らかに解決できますが、リンカーがさらに複雑になり、大きな利点はありません。)
ユーザーのミスを防ぎます。関数を作成するつもりでしinline
たが、定義を .cpp ファイルに入れているためにコンパイラが黙って無視した場合、間違いを見つけるのは困難です。プログラムは引き続き実行されますが、遅くなります。