私は、静的ライブラリとして最終的になる小さなC数学ライブラリを書き直しています。これは、ベクトル演算インターフェイスのインライン展開の恩恵を受けたいと思っています。スタティックライブラリを正しくインライン化する方法
私は次があります。
[mymath.h]
...
...
extern float clampf(float v, float min, float max);
...
...
[mymath.c]
inline float clampf(float v, float min, float max)
{
if(v < min) v = min;
if(v > max) v = max;
return v;
}
私のライブラリが静的になり、私はするつもりだので、 .h
(および.lib
)をユーザーに提供する場合、コンパイル時にclampf
関数がプログラムにインライン化されますか?
私は正しいことをしていますが、extern
を.h
に、.c
にインラインで宣言していますか?
私はあなたの答えが間違っていると確信しています。 'inline'という関数を定義し、' static inline'ではなく、その関数が複数のコンパイル単位で使われていると、リンクは失敗します。 GCC 4.6と-std = c99でテストされています。関数定義 'extern inline'を宣言すると動作しますが、これはGCC拡張です。 – kay
@kay:答え全体を読む。あなたは、関数のための 'extern'宣言を翻訳単位のどこかに(すなわちヘッダーにではなく)追加しなければなりません。これにより、非インラインバージョンがそのモジュールで発行されます。 (ヘッダファイルは一般にそのユニットからインクルードされるべきです)C99標準を参照するか、http://www.greenend.org.uk/rjk/tech/inline.htmlを参照してください。 –
私は確信しています:-) – kay