ヘッダーのみのライブラリを作成するにはどうすればいいですか? 質問する

ヘッダーのみのライブラリを作成するにはどうすればいいですか? 質問する

クライアントが使いやすくなるよう、現在作業中のライブラリをヘッダーのみのライブラリとしてパッケージ化したいと考えています。(ライブラリは小さいので、別の翻訳単位に入れる理由はまったくありません) ただし、コードを単純にヘッダーに入れることはできません。これは、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 :(
}

おすすめ記事