我正在创建一个只有头文件的 C++11/14 库,但我不确定应该如何处理#include
库文件之间的指令。
我应该尝试#include
在面向用户的模块头文件中对尽可能多的指令进行分组,还是内部文件应该包含它们需要的文件(有时重复相同的包含)?
方法一:
在这种方法中,模块头文件包含所有必需的依赖项,然后包含实现。实现的头文件本身不包含任何内容。
// 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 更快,或者相反。