Sun Studio 12: C ユーザーズガイド

D.1.10 inline 関数

6.7.4 関数指示子

C99 では、関数指示子 inline が追加されました。inline は、内部および外部リンクのある両方の関数で完全に機能します。インライン関数の定義および extern インライン関数が、1999 C ISO 規格の仕様どおりに機能するようになっています。

インライン関数定義とは、キーワード inline を使い、static または extern キーワードなしで定義された関数です。ソース (またはインクルードファイル) 内に含まれるあらゆるプロトタイプにも、static または extern キーワードなしでキーワード inline が含まれます。

インライン関数定義は、関数に外部定義を提供しません。インライン定義を含むソースファイルに現れる関数呼び出しはどれも、呼び出し位置で関数定義をインライン化するか、外部定義された関数を参照することによって実現されます。

最適化による利点を考慮した結果、コンパイラは、そうすることにメリットがあると判断した場合にのみ、インライン定義への呼び出しをインライン化します。これ以外の場合は、外部関数に対する呼び出しが行われます。このため、インライン定義を含むプログラムは、extern 関数定義を含むオブジェクトファイルとリンクさせることを推奨します。

関数定義とともに (あるいは関数定義を継続するファイルの任意のプロトタイプ上で) extern および inline 両方のキーワードを使用すると、外部関数がそのオブジェクトファイル内に定義されます。C++ リンクと互換性を維持するため、extern インライン関数の定義を複数含むオブジェクトをリンクする場合、リンカーは、そうした関数のうちの 1 つだけ選択し、すべての外部参照を実現します。

規格に適合した動作を実現するには、最新のコンパイラを使って古いコードをコンパイルする必要があります。ただし、古い C および C++ バイナリ (C/C++ 5.6 より前) で extern インライン関数を使用していて、その古いバイナリの動作を変更することなく、新しい C および C++ バイナリとリンクする場合は、 -features=no%extinl を指定します。