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

Sea*_*hot 3 c++ design-patterns

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

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


由于上面的问题,当我在eclipse中加载程序时,我面临许多"多个声明"错误,即使我在所有.hpp文件中添加了标题保护.

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

Q3.如果我的.cpp文件中有两个或更多需要使用相同的头文件,那么包含所有这些头文件的最佳方法是什么?我应该创建一个新的头文件,例如h1.hpp,在这些.或更多.cpp文件中包含我需要的所有头文件,然后在这些.cpp文件中包含这个头文件?

这是一种有效的方法吗?

Bar*_*icz 5

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

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

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

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

不会.标头防护装置会阻止一个翻译单元中的两个(或更多)其他标头包含两次相同的标头.由于.cpp每个翻译单元只有一个文件,因此不会出现此问题.

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

  common.hpp
   /      \
  /        \
A.hpp     B.hpp
  \        /
   \      /
   file.cpp
Run Code Online (Sandbox Code Playgroud)

在这种情况下,头文件保护common.hpp防止其出现两次在TU引入file.cpp.

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

一般来说,你不应该被长链包围害怕.它看起来不那么可怕.如此说来,"聚集体"报头可用于如果所述报头实际上形成一个树结构(使包括子集更加容易,像collections.hppcollections/vector.hpp+ collections/list.hpp)或以包括每一个从所述库头.