首先看一下编译过程:
预编译:完成替换。
编译源文件,生成符号表,只要符号被声明就行,不需要存在。如果符号没有声明,就会报编译错误。
链接,确认所有符号存在-------》如果符号不存在,也就是没有定义,就会报链接错误。
运行
比较好的做法:
cpp文件放函数的定义,头文件放变量和函数的声明。这样,这个头文件可以被其它使用这个函数的文件include。由于这里是函数声明,所以可以任意多个文件include它。
注意,cpp文件和头文件可以分别编译两个目标文件,在链接阶段进行链接。
include是预编译,所以会把头文件的内容copy到cpp文件。
小结:
1)变量和函数的声明放在头文件中,但是类的定义需要放到头文件中,类的实现放到cpp文件中。
2)const类型的对象是可以放到头文件中。
3)内联函数,可以放到头文件中。
4)如果类的实现,也就是函数定义放到头文件中,变成内联函数,也是允许的,这就是hpp的做法。但是仅仅放到头文件中,没有变成内联函数是不允许的。
5)头文件保护的作用是防止一个cpp文件多次include同一个头文件,而不是防止多个cpp文件include同一个头文件。也就是编译都是按照文件单位。
6)头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。全局变量的定义宜放在某个 .c 文件中,而 .h 文件里写的是变量的声明。头文件应用于声明而不是用于定义。
7