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

外部リンケージを持つ C99 インライン関数の規則は C++ の規則とは異なります。 C99 はインライン定義と外部定義を区別します。 インライン関数が定義されている任意の変換単位において、インライン関数が extern ではなく inline を使用して常に宣言されている場合、それはインライン定義になります。 それ以外の場合は外部定義になります。 これらのインライン定義は、--no_inline が使用されている場合であってもアウトオブラインコピーの生成には使用されません。

各インライン関数を使用する場合は、同じ変換単位の定義(インライン定義または外部定義)を使用してインライン展開されるか、外部定義の呼出しが行われます。 インライン関数を使用する場合、変換単位に 1 つの外部定義のみを含める必要があります。 これは外部関数を使用した場合に適用される規則と同じです。 実際には、使用するすべてのインライン関数がインライン展開される場合、外部定義が含まれていなくてもエラーは発生しません。 --no_inline を使用した場合は、外部定義のみが使用されます。

通常は、extern ではなく inline を使用して、外部リンケージを含むインライン関数をインライン定義としてヘッダファイルに配置します。 単一のソースファイルにも外部定義あります。 以下に例を示します。

Example 32. C99 での関数のインライン展開

/* 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++ では特別な外部定義はなく、それに対する要件もありません。

インライン関数の定義は変換単位ごとに異なるものを使用できます。 ただし、通常はExample 32のように同じものが使用されます。

--multifile または --ltcg を使用してコンパイルする場合、ある変換単位での呼び出しが別の変換単位の外部定義を使用してインライン展開されることがあります。

C99 ではインライン定義にいくつかの制限があります。 変更可能なローカルのスタティックオブジェクトは定義できません。 また静的リンケージ含む識別子は参照できません。

C99 モードでは、その他のモードと同様に、__inlineinline は同一です。

静的リンケージを含むインライン関数の C99 での動作は C++ と同じです。

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0472GJ
Non-ConfidentialID051612