#include
ヘッダーのみの C++11/14 ライブラリを作成していますが、ライブラリ ファイル間のディレクティブをどのように処理すればよいかわかりません。
#include
ユーザー指向のモジュール ヘッダー ファイルでできるだけ多くのディレクティブをグループ化する必要がありますか、それとも内部ファイルに必要なファイルを含める必要がありますか (同じインクルードを繰り返すこともあります)。
アプローチ A:
このアプローチでは、モジュール ヘッダー ファイルに必要なすべての依存関係が含まれてから、実装が含まれます。実装のヘッダー ファイルには、それ自体には何も含まれていません。
// Library/Module/Module.hpp
// This file is intended to be included by the user in his projects.
#ifndef MODULE
#define MODULE
#include <vector>
#include "Library/Module/Impl/SharedDependency.hpp"
#include "Library/Module/Impl/Class1.hpp"
#include "Library/Module/Impl/Class2.hpp"
#endif MODULE
-
// Library/Module/Impl/SharedDependency.hpp
#ifndef SHARED_DEPENDENCY
#define SHARED_DEPENDENCY
inline void sharedFunc() { }
#endif
-
// Library/Module/Impl/Class1.hpp
#ifndef CLASS1
#define CLASS1
// No need to include "SharedDependency.hpp", as it will be included by
// the module header file. Same applies for <vector>.
struct Class1
{
std::vector<int> v;
Class1() { sharedFunc(); }
};
#endif
-
// Library/Module/Impl/Class2.hpp
#ifndef CLASS2
#define CLASS2
// No need to include "SharedDependency.hpp", as it will be included by
// the module header file. Same applies for <vector>.
struct Class2
{
std::vector<int> v;
Class2() { sharedFunc(); }
};
#endif
アプローチ B:
このアプローチでは、モジュール ヘッダー ファイルには実装ヘッダーのみが含まれます。実装ヘッダーに追加のインクルードが必要な場合は、ファイル自体が (再帰的に) インクルードされ、同じインクルードが繰り返されることがあります。
// Library/Module/Module.hpp
// This file is intended to be included by the user in his projects.
#ifndef MODULE
#define MODULE
#include "Library/Module/Impl/Class1.hpp"
#include "Library/Module/Impl/Class2.hpp"
#endif MODULE
-
// Library/Module/Impl/SharedDependency.hpp
#ifndef SHARED_DEPENDENCY
#define SHARED_DEPENDENCY
inline void sharedFunc() { }
#endif
-
// Library/Module/Impl/Class1.hpp
#ifndef CLASS1
#define CLASS1
#include <vector>
#include "Library/Module/Impl/SharedDependency.hpp"
struct Class1
{
std::vector<int> v;
Class1() { sharedFunc(); }
};
#endif
-
// Library/Module/Impl/Class2.hpp
#ifndef CLASS2
#define CLASS2
#include <vector>
#include "Library/Module/Impl/SharedDependency.hpp"
struct Class2
{
std::vector<int> v;
Class2() { sharedFunc(); }
};
#endif
最善のアプローチは何ですか?
直感的には、同じインクルードを繰り返すことを避け、他のファイルの前にどのファイルをインクルードする必要があるかを明確にするため、アプローチ Aが最適だと思います。ただし、最大の欠点は、インクルード ディレクティブのない実装ファイルで、私の IDE ( QT-Creator ) で構文の強調表示が機能しなくなることです。
編集:
この質問は、 「意見に基づく」という理由で終了するように投票されました。ファイルを含む私のライブラリのような大規模なヘッダーのみのプロジェクトでは、多くのコンパイル時間がかかる可能性があるため、私は同意しません。したがって、アプローチ A はアプローチ B よりも速い場合もあれば、その逆の場合もあります。