http://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html
编译单元 当一个c或cpp文件在编译时,预处理器首先递归包含头文件, 形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。 这个编译单元会被编译成为一个与cpp 文件名同名的目标文件 。 连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。 定义只可以出现一次,而声明则可以出现多次 extern int ival = 10; // initializer, so it's a definition double fica_rate; // no extern, so it's a definition 同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义链接错误。
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。 |
头文件不应该含有定义这一规则,有三个例外。头文件可以定义类,值在编译时就已知道的 const 对象和 inline 函数
const 变量(第 2.4 节)默认时是定义该变量的文件的局部变量。正如我们现在所看到的,这样设置默认情况的原因在于允许 const 变量定义在头文件中。
这种行为有一个很重要的含义:当我们在头文件中定义了 const 变量后,每个包含该头文件的源文件都有了自己的 const 变量,其名称和值都一样。
如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享。
在头文件中写变量的声明,函数声明,类的定义,inline函数,不要出现变量定义,类的函数非inline定义,函数定
义。