预编译头文件:效率还是内聚性?

来源:互联网 发布:java变量的初始化运行 编辑:程序博客网 时间:2024/06/06 00:07

     在用VC做项目的过程中,为提高C/C++头文件的编译速度,常用的做法是把一些常用的头文件放到一个头文件里,然后将这个头文件作为预编译头文件,程序的其他部分如果直接引用预编译头文件,就可以加快编译速度了。

 

      然而,如果预编译头文件使用不当,至少有两个缺点:

      1、程序间的耦合性增加,不需要的头文件也被引用了进来。

            这是由于预编译头文件通常集成了多个不同的头文件——不管你的模块用不用得到。

      2、增加了程序逻辑和编译特性的依赖关系。

            首先,头文件通常是模块的外部接口,对于头文件的包含,应该反映的是程序逻辑依赖关系,而不是编译关系。

           其次,由于VC下的预编译头文件命名方式通常是以“pch”结尾,进一步违反了模块设计的“单一职责”原则。这样的头文件反映的更多的是编译优化依赖关系,而不是程序逻辑依赖关系。

 

      不过,并不是所有编译器都想VC一样,把预编译和程序逻辑混在一起。例如,GCC的预编译头文件机制就是和头文件引用方式分离的。在GCC中,我们只要预编译我们关注的头文件,程序如果引用到这些头文件,就可以自动使用预编译特性了;反之,如果不预编译这些头文件,程序还按常规的方式编译。Borland的C++和Delphi编译器,也应该用类似于GCC的预编译机制实现,只是智能化程度更强,所有的头文件几乎都只编译一次,做到了自动预编译,因此速度更快。

 

     为VC预编译头文件的使用限制,对于大型项目,我建议遵守以下编程原则:

     1、模块内部引用,不用预编译头文件;模块之间引用,可以使用预编译头文件。

     2、模块间引用的头文件的名称,不必加“pch”后缀,而应该反映模块本身的意义,建议参考“windows.h“的设计和命名。

原创粉丝点击