C++;头文件和源文件设计实现 我对设置C++头和源文件的设计原则有一些疑问: 我最近接手了一个项目,在这个项目中,以前的程序员曾经有过这样的功能,这尤其令人恼火,因为我在某个地方读到,我们不应该在.hpp文件中包含.cpp文件(预处理器只会将.cpp文件复制并粘贴到.hpp文件中)

C++;头文件和源文件设计实现 我对设置C++头和源文件的设计原则有一些疑问: 我最近接手了一个项目,在这个项目中,以前的程序员曾经有过这样的功能,这尤其令人恼火,因为我在某个地方读到,我们不应该在.hpp文件中包含.cpp文件(预处理器只会将.cpp文件复制并粘贴到.hpp文件中),c++,design-patterns,C++,Design Patterns,问题1。在.hpp文件中包含.cpp文件是错误的吗?为什么? 由于上述问题,我在eclipse中加载程序时面临许多“多重声明”错误,尽管我在所有.hpp文件中都添加了头保护 问题2。我是否也应该在.cpp文件中包含标题保护? 我也试了一会儿,但没用。有什么建议吗? 第三季度。如果两个或多个my.cpp文件需要相同的头文件 使用什么是包含所有这些头文件的最佳方式?我应该吗 创建一个新的头文件,比如h1.hpp,包括所有的头文件I 需要包含在这2个或更多.cpp文件中,然后包含在此标题中 是否在那

问题1。在.hpp文件中包含.cpp文件是错误的吗?为什么?


由于上述问题,我在eclipse中加载程序时面临许多“多重声明”错误,尽管我在所有.hpp文件中都添加了头保护

问题2。我是否也应该在.cpp文件中包含标题保护? 我也试了一会儿,但没用。有什么建议吗?

第三季度。如果两个或多个my.cpp文件需要相同的头文件 使用什么是包含所有这些头文件的最佳方式?我应该吗 创建一个新的头文件,比如h1.hpp,包括所有的头文件I 需要包含在这2个或更多.cpp文件中,然后包含在此标题中 是否在那些.cpp文件中创建文件

这是一种有效的方法吗

在.hpp文件中包含.cpp文件是错误的吗?为什么?

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

更重要的是,它混合了实现和接口部分之间的分离。当要包含包含实现的文件时,通常会将其扩展名更改为
.inl
(从“inline”)扩展名

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

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

举例来说,包含的示例如下所示:

  common.hpp
   /      \
  /        \
A.hpp     B.hpp
  \        /
   \      /
   file.cpp
在这种情况下,
common.hpp
中的标题保护可防止它在为
file.cpp
引入的TU中出现两次

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


一般来说,你不应该被一条长长的包含链吓到。它不像看上去那么可怕。这就是说,如果标题实际上形成了一个树形结构,则可以使用“聚合”标题(以使包含子集更容易,如
collections.hpp
collections/vector.hpp
+
collections/list.hpp
)或者希望在新的C++标准中很快就消失了H/CPP文件的疯狂。@安德烈亚诺诺夫,这让我好奇,如何?头保护不利于多个定义,因为头保护允许多个被保护文件的包含,而不是由同一个翻译单元。您需要将声明和定义分开。将声明放在头文件中,将定义放在cpp文件中,一切都会正常工作。@nwp我所有的声明都在.hpp文件中,定义都在.cpp文件中。顺便说一句,我也在使用类模板,不知道这些是否把事情搞砸了。@jnbrq CanberkSönmez modules。谢谢。这是非常直观的。我现在明白了为什么在.cpp文件中不需要头保护。另外,我可以很好地从命令行编译和运行我的项目,但是在eclipse中不能这样做。该怪密码子吗?即使如此,这也没有意义。@SeasonalShot IDE相关问题将超出此问题的范围。我建议你为此贴一张新的。