为什么头文件不是编译的对象
1、头文件与包含指令(#include)
那些没有被项目中任何源文件包含的头文件,编译器是不去理会它的,不管它有没有语法错误,也不管它是否已添加到项目中。
2、包含指令的执行
包含指令是一种预编译指令,它的执行就像宏替换一样。先找到头文件,然后把头文件中定义的所有符号在包含指令所在源文件中也定义一下。因此如果相互引用头文件就好比重复定义,就报错了。
3、程序编译连接过程
3、引号和尖括号区别
用尖括号 #include <>:
一般用于包含标准的库头文件,编译器会去系统配置的库环境变量和者用户配置的路径去搜索,而不会在项目的当前目录去查找
用双引号 #include "":
一般用于包含用户自己编写的头文件,编译器会先在项目的当前目录查找,找不到后才会去系统配置的库环境变量和用户配置的路径去搜索
4、链接错误:无法解析的外部符号
这是写0SG程序时,经常出现的错误,常常是由于没有添加必要的静态链接库的问题。配置0SG时我们还要配置库文件目录,这是要告诉链接器在哪里找到这些静态链接库。
5、链接错误:一个或多个多重定义的符号/同一个头文件被多个源文件包含
那么预编译后的每个源文件都会有头文件的拷贝,头文件中定义的全局变量就会在每个源文件中定义一次,在相应的目标文件中也会有定义,链接时就会出现问题了。