我对布局C ++标头和源文件的设计原则有一些疑问: 我最近接手了一个项目,其中前一个程序员曾经有过这个,这特别令人讨厌,因为我在某个地方读到我们不应该在.hpp文件中包含.cpp文件(预处理器只会复制和粘贴。将cpp文件转换为.hpp)
Q1。在.hpp文件中包含.cpp文件是不是很糟糕?为什么呢?
由于上面的问题,我在eclipse中加载程序时遇到了很多“多重声明”错误,即使我在所有.hpp文件中添加了标题保护。
Q2。我是否应该在.cpp文件中包含标题保护? 我也尝试过后来但无济于事。有什么建议吗?
Q3。如果我的.cpp文件中有两个或更多需要相同的头文件 使用什么是包含所有这些头文件的最佳方法?我是不是该 创建一个新的头文件说h1.hpp,包括我的所有头文件 需要在那些2个或更多.cpp文件中以及稍后包含在此标题中 文件在那些.cpp文件中?
这是一种有效的方法吗?
答案 0 :(得分:5)
在.hpp文件中包含.cpp文件是不是很糟糕?为什么呢?
在典型的代码设置中,是的。它没有任何用处,可能导致重复定义"错误。
更重要的是,它混合了实现和接口部分之间的分离。当包含实现的文件包含在内时,它通常会更改为.inl
(来自"内联")扩展名。
我是否应该在.cpp文件中包含标题保护?
没有。标题保护防止一个翻译单元中的两个(或更多)其他标题包含两次相同的标题。由于每个翻译单元只有一个.cpp
个文件,因此该问题不会发生。
为了说明,示例包含可能如下所示:
common.hpp
/ \
/ \
A.hpp B.hpp
\ /
\ /
file.cpp
在这种情况下,common.hpp
中的标题保护会阻止它在为file.cpp
引入的TU中出现两次。
如果我的.cpp文件中有两个或更多需要使用相同的头文件,那么包含所有这些头文件的最佳方法是什么?
一般来说,你不应该被长链包围害怕。它看起来不那么可怕。话虽如此,"聚合"如果标题实际形成树结构(以使包含子集更容易,如collections.hpp
和collections/vector.hpp
+ collections/list.hpp
)或包含每个标题,则可以使用标题来自图书馆。