7

gcc は C99 標準で指定されたインライン モデルに完全に準拠していますか?

この問題に関する情報を閲覧しました。しかし、インライン関数を「extern」または「static」で指定しなければならない理由がわかりません。

.c ファイルで、同じ翻訳単位で定義されたインライン関数を呼び出すと、エラーが発生します。コンパイラの動作の理由は何ですか?

Is “inline” without “static” or “extern” ever useful in C99?という投稿を見つけました。

これは何を意味するのでしょうか?

インライン定義が表示されている場所で外部リンケージを持つ関数 func の呼び出しが発生した場合、動作は、内部リンケージを持つ別の関数 (__func など) に対して呼び出しが行われた場合と同じです。

4

3 に答える 3

-1

コードがどのようにリンクされるかを考える必要があります。最初に、ソース コードがオブジェクト ファイルにコンパイルされます。これらのオブジェクト ファイルには、関数の名前 (または c++ のマングルされた名前) をインデックス付けすることによって検出される各関数のバイナリ コードが含まれているだけです。オブジェクト ファイルには、関数をインライン化するかどうかに関する情報は含まれていません。したがって、この情報は、リンク プロセス中にオブジェクト ファイルと組み合わせて使用​​されるヘッダー ファイルに配置する必要があります。staticファイル内でinlinein before を使用することにより、その関数をコンパイル プロセスの前に、.cその関数を使用する他の関数から見えるようにします。static inlineしかし、これらの関数がオブジェクト ファイルにコンパイルされると、他のオブジェクト ファイルの他の関数と「インライン展開」することはできません。

したがって、ソース ファイル ( ) の代わりにinlineヘッダー定義 ( file) にキーワードを含めるだけで、リンク プロセスで、あるオブジェクト ファイルの関数を別のオブジェクト ファイルの関数内に「インライン化」できます。.h.c

于 2017-09-15T14:04:33.617 に答える