0.编译器会对所有源文件各自进行编译成目标文件。声明的作用就是某个源文件当编译到当前位置,而所需目标的定义不存在时,提示继续编译下去,后续链接时会到其它所有编译后的源文件即目标文件中去查找;反之,若无声明则报错。
1.头文件不会直接编译为二进制文件,只有当源文件引用了头文件,此时的头文件才会添加到(复制所有内容)源文件中一起编译。
2.通常不在头文件定义变量,是因为防止多个源文件引用该头文件导致重复声明;但如果实际要这样做,可以像下面那样定义一个private后缀的头文件,只让一个源文件(A.c)使用.
A.c A.h A_private.h
3.在头文件引用头文件以及头文件相互引用是不好的设计.
4.对于结构体,只提供声明而没有定义,“0”情况不一定成立,即使用该结构体的源文件不一定能继续编译下去,仅限于用该结构体声明一个指针变量,但未在提供其定义前不能对该变量使用任何成员操作符。这其实就是前向声明。
比如A.h使用一个未知定义(在B.h定义)的结构体,将它定义为某个指针成员,在未包含头文件B.h进来之前,不能对这个指针成员使用任何成员操作符等,只有(如在A.c)包含该头文件B.h进来后,就可以对这个指针成员进行操作了。