static inline
、extern inline
と通常のinline
関数の違いは何ですか?
私はこれについていくつかの漠然とした説明を見てきました。私が理解している限り、static inline
は単なるinline
関数ではなく、static
キーワードが通常意味する特定のファイル内でのみ参照されることを意図しています。同じことがextern inline
にも当てはまります。おそらく、extern
変数の場合と同じ説明ではありません。どんな答えでも大歓迎です!
static inline
を使用した関数定義は、内部リンケージを使用したインライン関数を定義します。このような関数は、これらの修飾子の「通常の」プロパティから「期待どおりに」機能します。static
は内部リンケージを提供し、inline
はインラインにします。したがって、この関数は翻訳単位に対して「ローカル」であり、その中にインライン化されています。
inline
だけの関数定義は、外部リンケージを持つインライン関数を定義します。ただし、そのような定義はインライン定義と呼ばれ、その関数の外部定義としては機能しません。つまり、この関数には外部リンケージがありますが、どこかに別の外部定義を指定しない限り、他の変換ユニットからは未定義と見なされます。
extern inline
を使用した関数定義は、外部リンケージを使用したインライン関数を定義すると同時に、この定義はこの関数の外部定義として機能します。このような関数は、他の変換ユニットから呼び出すことができます。
最後の2つの段落は、外部リンケージを持つインライン関数に単一のextern inline
定義を提供するか、1つはinline
、もう1つはextern
の2つの別個の定義を提供するかを選択できることを意味します。後者の場合、関数を呼び出すと、コンパイラーは2つの定義のいずれかを選択できます。