一.头文件为什么只声明而不定义,而类定义又可以在头文件中那???
了解基本的概念:
编译单元:对于c语言,每一个.c文件就是一个编译单元。仅从编译而言,各个编译单元之间没有联系。
未解决符号表:提供了在该编译单元引用但是定义并不在本编译单元的符号及其地址。
导出符号表:提供了本编译单元具有定义,而且愿意提供给其他编译单元使用的符号及其地址。
.c文件被编译后每个编译单元都会生成两张表,未解决符号表和导出符号表。
链接后每个编译单元就会向其他的编译单元的导出符号表查找自己的未解决的符号表中的符号。
如果在其他编译单元中存在查不到的符号,就会报
而那些符号会进入未解决符号表,那些会进入导出符号表。
extern 就是告诉编译器这个符号的定义在别的编译单元中,符号会放在未解决符号表中。
static 就是告诉编译器这个变量或函数的符号只在该编译单元中使用,不放在导出符号表中。就是链接时不可见。
还有一些结构体定义,类定义默认为内部链接,为static,
而函数默认为外部链接,函数名会放在导出符号表中,所以函数在内部调用时加修饰符static。
一般头文件只声明而不定义的原因是:假如一个头文件有变量的定义,当这个头文件被多个.c文件包含,在链接的时候就会在不同的编译单元导出符号表中查找出重复定义,就会报一下错误:
类定义可以在头文件中的原因为:
而类的定义就是默认为static,内部链接,在其他的编译单元不可见,即使它被重复包含。