前言
我们在写C++的时候,通常是将定义写在.cpp文件内,将声明写在.h(header)文件内。自从我开始写C++以来,将近两年时间都是这么写的,也从来没考虑过为什么要这么写,以为这就是一个约定。最近用python写了几个月的毕业设计,C++都快忘光了,找个视频重新捡起来,视频里讲的很详细。这篇文章将我看过的有关头文件的部分进行一下梳理和总结。
参考视频地址
http://bit.ly/2kumpdb(原地址)
https://www.bilibili.com/video/av68697716?p=1(B站搬运+翻译版)
本文内容:
1.#include的作用
2.为什么在头文件里写函数声明
3.#program once和#ifndef等等
1.#include的作用
当我们看到#include这行语句开头的“#”,就可以知道这是一句“预处理”语句,在C++生成可执行文件的过程中,要经过编译和链接两个步骤。在编译过程中,很重要的一步就是对这些预处理语句进行处理,比如我们熟悉的#define要在这个编译之前进行宏替换,这就是预处理的一部分,所有的以“#”开头的语句都会在这个时候进行处理,生成我们需要的代码送入后续步骤。因此我们要看一下对于一个简单的程序,我们#include一个头文件后再编译,它会生成什么样的代码。//main.cpp
#include <iostream>
int main()
{
return 0;
}
上面就是这段代码,什么也没有做,只是include一个我们入门C++时都会用到的头文件。接下来我们需要调整项目属性设置,使其编译结果输出到文件。右键项目->属性->C/C++ ->预处理器->预处理到文件(本节结束记得改回去,否则编译完无法生成.obj文件)
然后单独进行编译(ctrl+F7,不是F5),在项目Debug目录下就可以看到后缀名为.i的文件,我们将它拖到VS中进行显示,可以看到这个编译结果居然有5W多行!也就是说真正送到后面步骤进行处理的代码是这5W多行,而我们自己写的main在最后。
为什么我们只写了几行代码+include,编译生成的代码这么多行呢?这就和本节标题有关了:#include究竟做了些什么?答案其实很简单,编译器对于#include的处理就是把该文件的内容直接copy过来!而iostream是标准库的头文件,里面包含了太多东西,这才造成最终生成的代码量极大。
下面可以做一个有意思的事情,我们创建一个nothing.h文件,里面只写