.h头文件以前也没觉得如何的难用,总是在需要的时候就随手包含了进去,但现在看这些代码,总感觉心里不踏实,不知道在什么时候需要包含,什么时候没有必要包含,vc编译器在编译的时候是怎么处理.h和.cpp文件的,主要是对编译器原理太不熟悉,没办法,今天特意开辟了半天的时间好好的找了些资料,耐心地看看高人们的讲解,这里只是列出下自己现在对今天看到的知识做些总结。编译器的编译单位是.cpp文件,对每个cpp文件都生成一个.obj的目标文件,最后link连接成.exe可执行文件。合理地使用.h文件能够很好地理清项目工程的结构和提高编译的效率。头文件主要是对函数、全局变量的声明和一些宏的定义,.h文件是不参与编译的,#include宏的作用就是预处理的时候在使用这句话的地方用.h文件的内容替换掉这句话。
声明的作用也只是告诉编译器,某个函数或者变量符合在调用之前在程序的某处已经定义过,编译的时候不报错,#if !defined和#endif两个指令主要哦是为了避免在同一个编译模块(一个.cpp文件)中避免重复包含同一个.h文件。
由于C++对函数和变量的默认作用域都是文件级的(extern),也即是一个cpp文件是可以引用另一个cpp文件中定义的函数或者全局变量的,只要在包含相应的声明即可,在link程序连接.obj文件的时候会自动替我们找到对应的定义。
在编译器编译的时候,cpp文件定义的全局变量和函数在生成.obj文件中都有相应的外部标号,正是通过这个标号,link才能找到对应的定义,完成调用前的指向,如果用static关键字定义的变量和函数,则表明此变量和函数是文件内部的,编译器不产生外部标号,那么即使在别的.cpp文件中有此声明,在link的阶段也会报错。
另外类的定义跟函数和变量的定义有所不同,类的定义只是告知编译器此种类型所需的字节数和其他信息,并不分配内存空间,不能在同一个头文件中包含其定义,因为这样的话在编译器就不知道如何选择对应类的信息,而函数和变量是在同个文件可以重复包含的。
(写的很随意,把自己想起来的记了下来,只当回忆……)