一 头文件内容:
(1)一般包含:类的定义、extern 变量的声明和函数的声明。(定义只可以出现一次,而声明可以出现多次)。因为头文件要包含在多个源文件中,所以不应该有变量或函数的定义。
(2)三个例外:
*头文件可以定义类;
*值在编译时就知道的常量(const对象和#define等)和inline函数(在类内定义的函数默认是inline函数)。
*模板定义。模板通常在头文件中声明和定义或者在头文件include实现文件,因为编译器要进行实例化必须能够访问定义模板的源代码。模板在头文件定义不会造成多重定义的错误,因为在编译器和连接器的某一处,有一机制能够去掉指定模板的多重定义(c++编程思想)。
(3)inline函数(大多数是编译期行为,条款30):
*优点:免除函数调用成本;编译器可以对它进行最优化。*缺点:过度使用造成代码膨,增加目标代码大小。
二 编译单元内的变量定义:
(1)编译单元:
当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp 文件名同名的目标文件(.o或是.obj) 。链接器把不同编译单元中产生的符号联系起来,构成一个可执行程序。
(2)设计头文件时,应使其可以多次包含在同一源文件内。我们必须保证多次包含同一头文件不会引起该文件定义的类和对象被多次定义(编译时期错误),需要使用头文件保护符。例如:two.h和three.h都包含one.h,其中main.cpp 引入 two.h和three.h,这样就重复包含one.h。
例如:one.h的形式如下:
#ifndef HEAD_H
#define HEAD_H
your code
#endif
三 编译单元间(整个程序):
*如果在头文件内定义变量或者函数,则造成链接时的错误。