web-dev-qa-db-ja.com

静的インライン、外部インライン、および通常のインライン関数の違いは何ですか?

static inlineextern inlineと通常のinline関数の違いは何ですか?

私はこれについていくつかの漠然とした説明を見てきました。私が理解している限り、static inlineは単なるinline関数ではなく、staticキーワードが通常意味する特定のファイル内でのみ参照されることを意図しています。同じことがextern inlineにも当てはまります。おそらく、extern変数の場合と同じ説明ではありません。どんな答えでも大歓迎です!

25
Forever a noob

static inlineを使用した関数定義は、内部リンケージを使用したインライン関数を定義します。このような関数は、これらの修飾子の「通常の」プロパティから「期待どおりに」機能します。staticは内部リンケージを提供し、inlineはインラインにします。したがって、この関数は翻訳単位に対して「ローカル」であり、その中にインライン化されています。

inlineだけの関数定義は、外部リンケージを持つインライン関数を定義します。ただし、そのような定義はインライン定義と呼ばれ、その関数の外部定義としては機能しません。つまり、この関数には外部リンケージがありますが、どこかに別の外部定義を指定しない限り、他の変換ユニットからは未定義と見なされます。

extern inlineを使用した関数定義は、外部リンケージを使用したインライン関数を定義すると同時に、この定義はこの関数の外部定義として機能します。このような関数は、他の変換ユニットから呼び出すことができます。

最後の2つの段落は、外部リンケージを持つインライン関数に単一のextern inline定義を提供するか、1つはinline、もう1つはexternの2つの別個の定義を提供するかを選択できることを意味します。後者の場合、関数を呼び出すと、コンパイラーは2つの定義のいずれかを選択できます。

26
AnT