5.28 C99 モードでのインライン関数

外部リンケージを持つ C99 インライン関数の規則は C++ の規則とは異なります。

C99 はインライン定義と外部定義を区別します。インライン関数が定義されている任意の変換単位において、インライン関数が extern ではなく inline を使用して常に宣言されている場合、それはインライン定義になります。それ以外の場合は外部定義になります。これらのインライン定義は、--no_inline が使用されている場合であってもアウトオブラインコピーを生成しません。
各インライン関数を使用する場合は、同じ変換単位の定義(インライン定義または外部定義)を使用してインライン展開されるか、外部定義の呼び出しが行われます。インライン関数を使用する場合、変換単位に 1 つの外部定義のみを含める必要があります。これは外部関数を使用した場合に適用される規則と同じです。実際には、使用するすべてのインライン関数がインライン展開される場合、外部定義が含まれていなくてもエラーは発生しません。--no_inline を使用した場合は、外部定義のみが使用されます。
通常は、 extern ではなく inline を使用して、外部リンケージを含むインライン関数をインライン定義としてヘッダファイルに配置します。単一のソースファイルにも外部定義があります。例えば、
/* example_header.h */
inline int my_function (int i)
{
   return i + 42; // インライン定義
}
/* file1.c */
#include "example_header.h"
   ...// my_function() を使用する
/* file2.c */
#include "example_header.h"
   ...// my_function() を使用する
/* myfile.c */
#include "example_header.h"
extern inline int my_function(int); // 外部定義を行う
これは C++ に通常使用されるものと同じ方法ですが、C++ では特別な外部定義はなく、それに対する要件もありません。
インライン関数の定義は変換単位ごとに異なるものを使用できます。ただし、通常は上の例のように同じものが使用されます。
--multifile を使用してコンパイルする場合、ある変換単位での呼び出しが別の変換単位の外部定義を使用してインライン展開されることがあります。
C99 ではインライン定義にいくつかの制限があります。変更可能なローカルのスタティックオブジェクトは定義できません。また静的リンケージを含む識別子は参照できません。
C99 モードでは、その他のモードと同様に、 __inline inline は同一です。
静的リンケージを含むインライン関数の C99 での動作は C++ と同じです。
関連する概念
5.20 インライン関数
5.21 関数のインライン展開に関するコンパイラによる決定
5.22 関数の自動インライン展開とスタティック関数
5.23 インライン関数と、リンク時における未使用のアウトオブライン関数の削除
5.24 関数の自動インライン展開とマルチファイルのコンパイル
5.26 コンパイラモードとインライン関数
5.27 C++ および C90 モードでのインライン関数
5.29 インライン関数とデバッグ
関連する参考文書
5.25 関数のインライン展開に関するコンパイラの決定をオーバーライドすることの制限
8.107 --inline、--no_inline
8.134 --multifile, --no_multifile
10.8 __inline
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.