关于预编译头以及StdAfx.cpp的解惑

预编译头技术


中文名
预编译头技术
外文名
The precompiled header Technology
就是把头文件事先 编    译成一种 二进制的中间格式 后续的编译过程使用
一、什么是预编译头?
所谓预编译头,就是把头文件事先编译成一种 二进制的中间格式,。预编译头物理上与通常的.obj文件是一样的,但是千万不要把这个中间格式与. o/.obj/.a/.lib的格式混淆,他们是截然不同的!所以预编译头文件的特性和目标文件也不同(尽管他们都属于某种中间文件)。编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。——但也有类似的地方的,比如,它们都是 编译器之间不兼容的^_^,就是说你不能把VC生成的预编译头拿到GCC上去用。甚至扩展名都不一样,VC的是大家都熟悉的. pch,而GCC的,是.gch。
二、什么时候使用预编译头?
当大多.c或.cpp文件都需要相同的头文件时。
当某些代码被大量重复使用时。
当导入某些不同库都有实现的 函数,并产生混乱时。



关于预编译头以及StdAfx.cpp的解惑


预编译头就是将程序的头文件部分编译成一个二进制中间文件,提高整个工程的编译效率,一般以.pch格式存储。

      1. 在编译器重已经采用了时间戳的方式,为何还需要预编头呢?

        对.obj加以时间戳的方式,可以根据时间戳来决定哪些文件需要重新编译,从而提高效率。但重新编译这个文件,包括这个文件的头文件里的信息和预处理(指头文件中的预处理)都重新进行一遍,而预编译头正是解决了这个问题,将稳定的头文件内容预先编译为一个二进制中间文件。

      2. 只有头文件如何编译呢?

        编译器无法直接编译头文件,那么就需要一个CPP和结合头文件一起编译,这样就是为什么通常MFC工程中存在一个StdAfx.cpp,其内容仅仅显示:
  1. // stdafx.cpp : 只包括标准包含文件的源文件  
  2. // TurnRound.pch 将作为预编译头  
  3. // stdafx.obj 将包含预编译类型信息  
  4.   
  5. #include "stdafx.h"  
        通常将常用的头文件都放到stdafx.h头文件中。

      3. fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h" to your source?

         在MFC中编程中最常见不过的了,因为MFC工程默认采用了预编译头,之后必须在.cpp文件头部包含stdafx.h(注意一定要放在头部,不然前面的头文件会被忽略);右击我们出错的的文件可以找到证据:

                    

           如果你关闭预编译头,可以发现没有了这个error。但既然预编译头带来这么多好处,为何不使用呢?

        4. 创建属于自己的预编头(本人采用VS2005)

           (1)第一步,创建stdafx.h 和 stdafx.cpp, 将常用的头文件放入stdafx.h中(一般选择稳定的头文件,因为编译产生预编译头时间比较长),在stdafx.cpp中添加代码

  1. #include "stdafx.h"  
          (2)第二步,右击工程属性=》配置属性=》c/c++ =》预编译头,选择使用预编头, "通过文件创建/使用PCH"填写 stdafx.h

          (3)第三步,右击stdafx.h属性,配置属性=》c/c++ =》预编译头,选择创建预编译头,"通过文件创建/使用PCH"填写 stdafx.h


参考:
预编译头  百度
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值