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

C++ Header and Source file design implementation

本文关键字:实现 源文件 文件 C++      更新时间:2023-10-16

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

Q1.在.hpp文件中包含.cpp文件不好吗?为什么?


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

Q2.我应该在.cpp文件中也包括头保护吗?我后来也试过了,但没有用。对此有什么建议吗?

Q3.如果我的.cpp文件中有两个或多个需要相同的头文件使用了包含所有这些头文件的最佳方式是什么?我应该吗创建一个新的头文件,比如h1.hpp,包括所有的头文件I需要在这2个或多个.cpp文件中,并在以后包含在此标头中那些.cpp文件中的文件?

这是一种有效的方法吗?

在.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(,或者包含库中的每个标头,则可以使用"聚合"标头。