一直以来的困惑:头文件的价值及其必要性

我亲眼目睹,每一个迈向死亡的生命正在热烈生长。 ——《巨人的陨落》

受Python的影响,我一直以为#includeimport是同样的意思,就是把其它文件中的各种内容引入当前文件。但是带着这样的思路去阅读C++代码总是屡屡受阻。这次终于搞清楚了,把看到的一些点记录下来。

\#include是一个来自C语言的宏命令,它在编译器进行编译之前,即在预编译的时候就会起作用。#include的作用是把它后面所写的那个文件的内容,完完整整地、一字不改地包含到当前的文件中来。值得一提的是,它本身是没有其它任何作用与副功能的,它的作用就是把每一个它出现的地方,替换成它后面所写的那个文件的内容。简单的文本替换,别无其他。

C语言中的头文件并不是必须的,如果两个.c文件中有调用关系,在编译时将两个文件都加入program后生成的程序是可以正常运行的。

不过.cpp文件与.h文件的区别其实是人为划分的,或者说是约定俗成的,真正起作用的是编译单元,所以你甚至可以在.cpp文件中include一个txt文件。编译器预处理时,要对#include命令进行“文件包含处理”:将file.h的全部内容复制到#include “file.h”处。C++中每一个.cpp是一个编译单元,各个编译单元彼此之间相互独立,因此头文件在其中起到了一个桥梁的作用,可以让一个编译单元用上另一个编译单元的东西。

不同于 java/c# 编译出来的二进制里包含了元数据,编译的过程也可以直接读取元数据。对于C/C++,由于编译过程不能直接利用元数据,所以需要.h来提供原始版本的元数据。出现这样的情况,我还在知乎中找到了一个有趣的原因:这是因为 java/c# 语言在被发明出来的时候,内存空间的价格已经大大下降,运行时浪费几十KB内存没有什么影响,而C被发明的时候,64KB的内存是四百多美元。

最后附上别人总结的 C++ 头文件中可以包含与不能包含(否则会编译报错)的内容汇总:

.h文件中能包含:
 1. 类成员数据的声明,但不能赋值;
2. 类静态数据成员的定义和赋值,但不建议,只是个声明就好。
3. 类的成员函数的声明
4. 非类成员函数的声明 
5. 常数的定义:如:const int a=5; 
6. 静态函数的定义 
7. 类的内联函数的定义

.h文件中不能包含:

  1. 所有非静态变量(不是类的数据成员)的声明
  2. 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在.h文件中使用std::string

参考资料:

  1. C++头文件和源文件的关系
  2. 理解C++中的头文件和源文件的作用
  3. 知乎:为什么C/C++要分为头文件和源文件?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值