当前位置:  编程技术>c/c++/嵌入式

解析VC中预编译头文件的深入分析

    来源: 互联网  发布时间:2014-10-14

    本文导语:  一。为什么预编译头文件:预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++...

一。为什么预编译头文件:
预编译头的概念:
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码,甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
也许你会问:现在的编译器都有Time stamp的 功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocessor )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。
根据上文介绍,预编译头文件的作用当然就是提高编译速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。

我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:
#include     // MFC core and standard components
#include     // MFC extensions
#include     // MFC Automation classes
#include // MFC support for Internet Explorer 4 Common Controls
#include
这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。

二。如何预编译头文件:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。
1.如何在工程中使用预编译头文件:最简单的是在建立工程的时候选择“使用预编译头文件”;如果建立工程时没选,那么还可以在project ->Setting->C/C++ ->precompimed header中设置。
2.如何指定预编译头文件的头文件名:默认为StdAfx.h,不过可以通过project ->Setting->C/C++ ->precompimed header中设置成任何名字(实际是通过指令/Yc, /Yu)。然后再把稳定不变的代码的头文件包含到该头文件中即可。
3.需要的实现文件:编译需要CPP文件,而这个CPP文件自然地就是头文件名对应的CPP文件了,在这个CPP文件里只有一句胡:包含要预编译的文件头。
4.通过project ->Setting->C/C++ ->precompimed header中设置预编译文件的名称(以.pch结尾)(实际上是通过指定/Fp )。

三。如何使用预编译的头文件:
1.通过project ->Setting->C/C++ ->precompimed header设置好使用预编译头文件(/Yc, /Yu),依赖哪个头文件,及预编译好的头文件名。
2.如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)重新编译一遍就可以了。当然你可以傻傻的 Rebuild all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。
3.如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果。 (原因就在于编译器编译的时候不会编译stdafx.h前面的头文件)。

    
 
 

您可能感兴趣的文章:

  • Linux下重编译PHP后Apache竟然不能解析.php文件?
  • 解析如何加快mysql编译的速度
  • 新手求助,编译时说不能解析字符是怎么回事?
  • 怎样看到java程序经过编译后的代码内容(bytecode的)或者在bytecode在JVM执行时JVM所解析的代码
  • Markdown 解析和编译器 marked
  • UBOOT编译完后生成的u-boot.img(注意不是u-boot.bin)是什么文件?如何解析它?
  • ubuntu 12.10 上 android 编译环境搭建的深入解析
  • JDBC之PreparedStatement类中预编译的综合应用解析
  • GCC 编译c程序的方法及过程解析
  • 解析libcurl在android下的移植、编译与测试
  • 解析四则表达式的编译过程及生成汇编代码
  • javascript开源软件 iis7站长之家
  • c/c++中变量的声明和定义深入解析
  • 深入解析C语言中常数的数据类型
  • 深入解析mysql中order by与group by的顺序问题
  • 深入解析Linux下MySQL数据库的备份与还原
  • 基于android中读取assets目录下a.txt文件并进行解析的深入分析
  • 深入解析StringBuffer和StringBuilder的区别
  • c++关键字mutable深入解析
  • 内联函数inline与宏定义深入解析
  • 深入解析Oracle参数及参数文件
  • Grow heap (frag case) 堆内存过大的深入解析
  • 深入解析mysql.sock不见的问题
  • 引用参数和传值参数的区别深入解析
  • Android中asset文件夹与raw文件夹的区别深入解析
  • EditText属性深入解析
  • 深入解析int(*p)[]和int(**p)[]
  • [Oracle] RAC 之 - 负载均衡深入解析
  • C#中IList<T>与List<T>的区别深入解析
  • 深入解析System.load 与 System.loadLibrary
  • C# interface与delegate效能比较的深入解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • python下xml解析库lxml最新版下载安装以及代码示例
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • html中<checkbox>标签用法解析及如何设置checkbox复选框的默认选中状态
  • java 公式解析 表达式解析 expression-analyzer
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3