どのように私は、ヘッダのみのライブラリを作成するのですか?
-
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
また、私はあなたがあなたのヘッダのみのライブラリのコードでグローバル変数や静的変数のいずれかの使用を避ける必要があると思います。
一箇所にコンパイル部品のヘッダガードを使用します。
所属していません StackOverflow