残念ながら、すべてのコンパイラが C99 に完全に準拠していると主張していても、その時点で完全に準拠しているわけではありません。
これを行うための準拠した方法は次のとおりです。
// header file. an inline definition alone is
// not supposed to generate an external symbol
inline void toto(void) {
// do something
}
// in one .c file, force the creation of an
// external symbol
extern inline void toto(void);
たとえば、gcc の新しいバージョンは、それで問題なく動作します。
次のようなものを定義することにより、他のコンパイラ(プリテンダー)でそれを回避することができます
#ifdef PRETENDER
# define inlDec static
# define inlIns static
#else
# define inlDec
# define inlIns extern
#endif
// header file. an inline declaration alone is
// not supposed to generate an external symbol
inlDec inline void toto(void) {
// do something
}
// in one .c file, force the creation of an
// external symbol
inlIns inline void toto(void);
編集:
-std=c99
私が知っているC99 サポート (通常は option ) を備えたコンパイラ
- gcc (バージョン >= 4.3 IIRC) は正しい
inline
モデルを実装します
- pccも正しい
- ggc < 4.3 では、正しいモデルを実装するための特別なオプションが必要です。そうしないと、注意しないと複数のシンボルが定義される独自のモデルが使用されます。
- 特別な注意を払わなければ、icc はすべてのユニットでシンボルを出力するだけです。しかし、これらのシンボルは「弱い」シンボルであるため、競合は発生しません。彼らはあなたのコードを爆破するだけです。
- opencc、AFAIR、古い gcc 固有のモデルに従います
- 宣言があり、1 つのコンパイル単位で関数ポインターを使用しない限り、 clang は
inline
関数のシンボルをまったく出力しません。extern
- tcc は
inline
キーワードを無視します