どのように私は、ヘッダのみのライブラリを作成するのですか?

StackOverflow https://stackoverflow.com/questions/2225435

  •  19-09-2019
  •  | 
  •  

質問

私はそれが簡単にクライアントが使用できるようにすること、私は、ヘッダのみのライブラリとして働いているライブラリをパッケージ化したいと思います。 (それは小さなだと別の翻訳単位にそれを置くための理由は本当にありません)これはC ++の一つの定義ルールに違反するため、しかし、私は単にヘッダに自分のコードを置くことはできません。 (ライブラリヘッダは、クライアントプロジェクトの複数の翻訳単位に含まれていると仮定して)

どのようにそれはヘッダーのみにするために、ライブラリを変更しますか?

役に立ちましたか?

解決

あなたはinlineキーワードを使用することができます:

// header.hpp (included into multiple translation units)

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :)

inlineは、リンカーは、単に一つの定義を選び、残りを破棄することができます。

(それらの定義は実際には一致しない場合はこのように、あなたは...未定義の動作の良い量を得る!)

<時間>

はさておき、クラス型内で定義されたメンバ関数は、暗黙的にマークされている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 :(
}

他のヒント

リズは示唆してあなたの関数・メソッドの前に「インライン」を置くことを忘れてはいけないとして

ヘッダ・ガードを使用します。

すなわち

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
    // Function body
    return retType;
}

#endif

また、私はあなたがあなたのヘッダのみのライブラリのコードでグローバル変数や静的変数のいずれかの使用を避ける必要があると思います。

一箇所にコンパイル部品のヘッダガードを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top