为何要在add.cpp这类非main源文件中引入对应头文件?
为什么实现函数的.cpp文件要包含对应的头文件?
强制校验实现与声明的一致性
头文件里的函数声明是对外的接口约定,实现文件包含头文件后,编译器会自动比对函数实现和声明的签名是否完全匹配。比如你要是把add.cpp里的实现写成int add(double x, double y),而头文件里是int add(int x, int y),编译器会直接报错提示签名不匹配。要是不包含头文件,这类错误可能要到链接甚至运行阶段才暴露,排查起来要麻烦得多。减少重复修改,维护代码一致性
哪天你需要修改函数签名(比如把参数从int改成long,或者新增参数),只要修改头文件里的声明就行。实现文件因为包含了头文件,编译器会立刻检测到实现和声明不匹配,提醒你同步修改实现代码。要是不包含头文件,你很容易改了头文件却忘了改实现,导致代码逻辑混乱。处理复杂类型依赖
如果你的函数用到了头文件里定义的自定义类型(比如结构体、枚举、typedef别名),实现文件必须包含头文件才能识别这些类型。比如假设add函数的参数是struct Num,这个结构体定义在add.h里,那add.cpp里不包含头文件的话,编译器根本不知道struct Num是什么,直接报错。
拿你给的代码举例,现在add函数很简单,不包含头文件好像也能编译过,但只要函数稍微复杂一点,或者后续有修改,包含头文件的优势就体现出来了——它相当于给实现代码加了一层语法校验,确保实现完全符合对外的接口约定。
内容的提问来源于stack exchange,提问作者Eto Tenma
相关产品推荐
相关产品推荐

