C ++头文件和源文件设计实现

时间:2015-09-29 22:53:37

标签: c++ design-patterns

我对布局C ++标头和源文件的设计原则有一些疑问: 我最近接手了一个项目,其中前一个程序员曾经有过这个,这特别令人讨厌,因为我在某个地方读到我们不应该在.hpp文件中包含.cpp文件(预处理器只会复制和粘贴。将cpp文件转换为.hpp)

  

Q1。在.hpp文件中包含.cpp文件是不是很糟糕?为什么呢?

由于上面的问题,我在eclipse中加载程序时遇到了很多“多重声明”错误,即使我在所有.hpp文件中添加了标题保护。

  

Q2。我是否应该在.cpp文件中包含标题保护?   我也尝试过后来但无济于事。有什么建议吗?   

     

Q3。如果我的.cpp文件中有两个或更多需要相同的头文件   使用什么是包含所有这些头文件的最佳方法?我是不是该   创建一个新的头文件说h1.hpp,包括我的所有头文件   需要在那些2个或更多.cpp文件中以及稍后包含在此标题中   文件在那些.cpp文件中?

这是一种有效的方法吗?

1 个答案:

答案 0 :(得分:5)

  

在.hpp文件中包含.cpp文件是不是很糟糕?为什么呢?

在典型的代码设置中,是的。它没有任何用处,可能导致重复定义"错误。

更重要的是,它混合了实现接口部分之间的分离。当包含实现的文件包含在内时,它通常会更改为.inl(来自"内联")扩展名。

  

我是否应该在.cpp文件中包含标题保护?

没有。标题保护防止一个翻译单元中的两个(或更多)其他标题包含两次相同的标题。由于每个翻译单元只有一个.cpp个文件,因此该问题不会发生。

为了说明,示例包含可能如下所示:

  common.hpp
   /      \
  /        \
A.hpp     B.hpp
  \        /
   \      /
   file.cpp

在这种情况下,common.hpp 中的标题保护会阻止它在为file.cpp 引入的TU中出现两次

  

如果我的.cpp文件中有两个或更多需要使用相同的头文件,那么包含所有这些头文件的最佳方法是什么?

一般来说,你不应该被长链包围害怕。它看起来不那么可怕。话虽如此,"聚合"如果标题实际形成树结构(以使包含子集更容易,如collections.hppcollections/vector.hpp + collections/list.hpp)或包含每个标题,则可以使用标题来自图书馆。