5.27 C++ および C90 モードでのインライン関数

inline キーワードは C90 では使用できません。C90 での __inline と C++ での __inline および inline の効果は同じです。

extern 関数をインライン展開の対象として宣言するには、使用されるすべての変換単位でその関数を定義する必要があります。また、各変換単位では同じ定義を使用する必要があります。
すべての変換単位で関数を定義するという要件は、外部リンケージがある場合にも適用されます。
インライン関数が複数の変換単位で使用される場合、その定義は通常はヘッダファイルに配置されます。
非インライン関数の定義をヘッダファイルに配置しないで下さい。変換単位ごとに関数が作成されることがあります。非インライン関数が extern 関数である場合は、リンク時にシンボルの重複が生じます。非インライン関数が static である場合は、不要なコードの重複が生じる場合があります。
C++ の構造体、クラス、または共用体の宣言で定義されたメンバ関数は、暗黙的にインライン展開されます。これらは inline キーワードまたは __inline キーワードを使用して宣言された場合と同様に処理されます。
インライン関数は、明示的に static として宣言されていない限り、 extern リンケージを持っています。インライン関数を static として宣言する場合は、関数のアウトオブラインコピーがその変換単位で一意になるようにする必要があるため、インライン関数を static として宣言すると、不要なコードの重複が生じる場合があります。
コンパイラは、関数をインライン展開できない場合、およびインライン展開しない場合に、関数のアウトオブラインコピーへの通常の呼び出しを生成します。
関数を使用するすべての変換単位で関数を定義するという要件は、つまり、コンパイラがすべての extern インライン関数のアウトオブラインコピーを生成する必要がないことを意味します。コンパイラが extern インライン関数のアウトオブラインコピーを生成する場合は共通グループを使用するため、リンカは重複を削除して、異なるオブジェクトファイルの同じアウトオブライン関数に 1 つのコピーのみを保持します。
関連する概念
5.20 インライン関数
5.21 関数のインライン展開に関するコンパイラによる決定
5.22 関数の自動インライン展開とスタティック関数
5.23 インライン関数と、リンク時における未使用のアウトオブライン関数の削除
5.24 関数の自動インライン展開とマルチファイルのコンパイル
5.26 コンパイラモードとインライン関数
5.28 C99 モードでのインライン関数
5.29 インライン関数とデバッグ
関連する参考文書
5.25 関数のインライン展開に関するコンパイラの決定をオーバーライドすることの制限
8.107 --inline、--no_inline
10.8 __inline
関連情報
共通グループまたは共通セクションの削除
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.