次のように、.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
あまり意味がありません。