编译过程:.c文件--预处理-->.i文件--编译-->.o文件--链接-->bin文件
在对一个编译单元(原文件)进行预处理时,编译器要做的其中一件事情就是把该文件包含的所有头文件拷贝到该文件中,如设有如下三个文件:
//a.h
void f1();
//b.h
void f2();
//main.cpp
#include "a.h"
#include "b.h"
void main()
{
}
当对main.cpp文件进行预处理后,该文件相当于:
void f1();
void f2();
void main()
{
}
下面列出应该放在文件和不应该放在文件中的语句:
int a; // 变量定义,不可以放在头文件中
extern int a; // 变量声明,可以放在头文件中
int f1(); // 函数声明,可以放在头文件中
int f1() {return 1;} // 函数定义,不可以放在头文件中
别,一般定义static全局变量时,都把它放在原文件中而不是头文件,因为static修饰的全局变量声明与定义同时进行。
需要注意的,模板的定义必须放在头文件中,因为模板的实例化是在编译期进行 的,在实例化时,编译器必须看到模板的完整定义,且编译器一次只能处理一个编译单元(.c文件),所以,如果模板在头文件中声明,把定义放在一个原文件中,当另一原文件通过包含头文件的方式调用这个模板,在编译时,由于无法看到模板的完整定义,编译会报错。