条款31:将文件间的编译依存关系降至最低

1、文件间依存度高的话带来的影响?

假如你修改了C++ class实现文件,修改的仅仅是实现,而没有修改接口,而且只修改private部分。此时,重新构建这个程序时,会发现整个文件、以及用到该class 的文件都被会被重新编译和连接,这不是我们想要看到的。

2、出现上述问题的原因

问题出在C++没有把关于接口与实现相分离这件事做好。C++ 的class 的定义式中不仅定义了接口,还定义了实现细目(成员变量)。
例如:

class Person{
    
public: 
    Person(const std::string& name, const Date& birthday, const Address& addr); 
    std::string name() const; 
    std::string birthDate() const; 
    std::string address() const; 
    ... 
private: 
    std::string theName;        //实现细目 
    Date theBirthDate;          //实现细目 
    Address theAddress;         //实现细目 
};

当编译器没有取得实现代码所需要的class string,Date和Address的定义式时,它无法通过编译它所需要的这样的定义式往往由#include <>提供(里面有class string,Date和Address的实现代码)。例如本例中需要:。

#include <string> 
#include "date.h" 
#include "address.h"

如果这些头文件中(或头文件所依赖的头文件)的一个的实现被改变了,那么每一个用到class 类的文件都得重新编译。这就是所谓的文件间的依存度比较高。

3、解决文件间依存性的一个不成熟方案

C++ 为什么不如下述这样做,以实现接口与实现分离呢?

namespace std {
    class string;} // 前置声明(不正确) 
class Date;// 前置声明 
class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译依赖关系是指在进行代码编译时,编译器需要知道每个源文件依赖的其他源文件或头文件。当某个源文件或头文件发生变化时,编译器可以根据依赖关系来判断需要重新编译哪些文件,以减少不必要的重新编译。 降低文件依赖编译的目的是减少代码修改后的重新编译范围,提高代码修改的效率。以下是一些降低文件依赖编译的方法: 1. 减少头文件的包含:头文件的修改会导致引用它的源文件重新编译。因此,减少不必要的头文件包含可以减少文件的依赖关系。只包含必要的头文件,并使用前向声明(forward declaration)来代替包含头文件。 2. 模块化设计:将功能模块分割成独立的源文件,每个模块只需包含它所依赖的头文件,而不是包含整个项目的所有头文件。这样可以减少源文件的直接依赖,提高代码修改的独立性。 3. 使用接口和抽象类:通过定义接口和抽象类来隐藏具体实现细节,其他模块只需依赖接口或抽象类而不是具体实现类。这样可以减少对具体实现的依赖,提高代码的灵活性。 4. 使用前向声明:如果只需要引用某个类的指针或引用,可以使用前向声明来代替完整的类定义。这样可以避免包含整个类的头文件,减少文件的依赖。 5. 依赖管理工具:使用依赖管理工具(如CMake、Makefile等)可以自动分析文件的依赖关系,并根据依赖关系进行增量编译,只重新编译发生变化的文件。 通过合理的代码设计和依赖管理,可以降低文件编译依赖关系,减少不必要的重新编译,提高代码修改的效率。这对于大型项目和频繁修改的代码是尤为重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值