头文件即.h文件,当我们编译代码时,只编译.c、.cpp文件(即源文件),头文件不会参与编译,所以可能有人就会问了,为什么还有存在头文件呢?
要回答这个问题,我们先来讲一下具体的编译的流程。
c++支持“分别编译”。也就是说,一个程序所有的内容可以分成不同的部分,分别写在不同的.cpp文件中。
编译时,不需要与其他文件互通。对于一个文件中调用的函数(必须要先声明),如果找不到定义,那么编译器会生成一个“符号表”,将函数名放入其中,等到链接时,链接器会在其他文件中寻找这个符号的定义,并链接。
这种机制给c++程序员带来好处,好处就是不用把所有代码都写进一个文件,变成一坨。但是也带来一个问题。一个函数还好,只需要一句声明,但是如果有很多个函数,那么就要写上如此冗长的声明语句,这根本不现实。
一种解决方法是把这些声明语句写在单独的一个文件中,等到哪个文件需要调用这些函数时,再把这些语句复制到该文件中,但是很显然,这种方法太笨拙。
所以头文件就诞生了!虽然叫头文件,其实也是源代码,只是不被编译。我们把那些声明语句放在头文件中,当某个文件需要他们时,就用#include宏包含这个头文件,当编译开始前,编译器会先把#include出现的地方自动替换为所包含文件的内容(即那些声明语句),这样就省却了我们手动复制代码的痛苦。
所以头文件中的语句只能是声明语句,不可以定义。如果写了定义语句,当多个文件包含这个头文件时,就出现了重复定义,当然这是不允许的。