クライアントが使いやすくなるよう、現在作業中のライブラリをヘッダーのみのライブラリとしてパッケージ化したいと考えています。(ライブラリは小さいので、別の翻訳単位に入れる理由はまったくありません) ただし、コードを単純にヘッダーに入れることはできません。これは、C++ の 1 つの定義ルールに違反するためです。(ライブラリ ヘッダーがクライアント プロジェクトの複数の翻訳単位に含まれていると仮定)
ライブラリを変更してヘッダーのみにするにはどうすればよいでしょうか?
ベストアンサー1
次のキーワードを使用できますinline
:
// header.hpp (included into multiple translation units)
void foo_bad() {} // multiple definitions, one in every translation unit :(
inline void foo_good() {} // ok :)
inline
リンカーが 1 つの定義を選択し、残りを破棄できるようにします。
(そのため、これらの定義が実際に一致しない場合は、未定義の動作が大量に発生します...!)
余談ですが、クラス型内で定義されたメンバー関数は暗黙的に次のようにマークされますinline
。
struct myclass
{
void i_am_inline_implicitly()
{
// because my definition is here
}
void but_i_am_not();
void neither_am_i();
};
inline void myclass::but_i_am_not()
{
// but that doesn't mean my definition cannot be explicitly inline
}
void myclass::neither_am_i()
{
// but in this case, no inline for me :(
}