.c ファイル内の C99 インライン関数 質問する

.c ファイル内の C99 インライン関数 質問する

次のように、.c (ヘッダー宣言なし) で関数を定義しました。

inline int func(int i) {
 return i+1;
}

次に、同じファイルで以下を使用します。

...
i = func(i);

リンク中に「'func' への未定義の参照」が発生しました。なぜでしょうか?

ベストアンサー1

C99のモデルinlineは、ほとんどの人が考えるものとは少し異なり、特にC++で使用されるモデルとは異なります。

inlineは、コンパイラが二重に定義されたシンボルについて文句を言わないようにするためのヒントにすぎません。関数がインライン化されることを保証するものではなく、必要な場合に実際にシンボルが生成されることも保証しません。シンボルの生成を強制するには、インスタンス化のようなものを追加する必要があります。定義inline

int func(int i);

通常、inline定義はヘッダー ファイルにあり、それが複数の .c ファイル (コンパイル単位) にインクルードされます。そして、上記の行はコンパイル単位の 1 つにのみ存在します。おそらく、コンパイラの実行に最適化を使用していないために、問題が発生しているだけでしょう。

したがって、 を .c ファイル内に含めるというユースケースはinlineあまり意味がありません。staticそれを目的に使用する方がよいでしょう。 追加してもinlineあまり意味がありません。

おすすめ記事