zoukankan      html  css  js  c++  java
  • C++ 预编译头文件

    使用C++提供的预编译头文件支持,如果应用程序是很大的头文件,使用预编译头文件可以大大降低应用程序的编译时间。但预编译头文件是如何产生的,什么情况下需要预编译头文件,如何创建预编译头文件,预编译头文件在编译器中编译后会产生什么,使用预编译头文件需要注意什么,接下来针对于这些问题一一讲解。

    (1)       预编译头文件产生原因

    编译器在编译程序时所做的事情主要分为预编译,编译,汇编,和链接。而针对于预编译过程主要针对的是源文件中含有的“#”的指令,比如#include,#define进行展开,详细的说就是:

    1. 把所有的“#define”删除,并且展开所有的宏定义
    2. 处理所有的条件预编译指令,比如 “#if”“#ifndef”“#else”“#endif”
    3. 处理“#include” 将被包含的文件递归插入到预编译指令的位置,之所以递归是由于被包含的文件可能还包含其它文件
    4. 删除所有的注释,比如“//”“/**/”

    这样就会存在一个问题就是,如果头文件相当的庞大,比如window.h甚至MFC库中所包含的各种头文件,如果将如此庞大的一个工程文件进行一一展开的话,编译的速度可想而知。

    然而,时代的进步,人们发现,在某个工程中,总会有那些一些头文件几乎是所有的cpp所必须包含的,这样将这些头文件提取出来,然后编译,可以提高编译的速度。所以预编译就这样产生了。

    (2)       创建预编译头文件

    最为简单的例子,以vs2008为例,打开项目,File -> New -> Project,建立一个win32 console application ,直接下一步,成功后,编译其会默认产生一个stdafx.h和Stdafx.cpp。产生.cpp文件的原因仅仅是让它可以编译而已,头文件是不可以被编译的。所以stdafx.cpp中一般仅包含一个其头文件,

    如果编译成功的话,在相对应的目录下会生成一个stdafx.pch的预编译头文件(.pch)。如果说,在编译程序的过程出现这样的问题:

    fatal error C1083: Cannot open precompiled header file: 'Debug×××.pch': No such file or directory

    表示.pch文件未创建成功,可右击工程打开属性修改:

    C/C++ -> 预编译头->创建/使用预编译头:创建预编译头(/Yc) 即可。

    如果文件过小,我不想使用预编译头文件,或者出现这样的问题:

    error C2857: 在源文件中没有找到用/Ycstdafx.h 命令行选项指定的#include语句

    可将其该.cpp文件属性修改为“不使用预编译头”即可,或将其stdafx.h添加到相应的.cpp文件中即可。

    (3)       注意事项

    1. 倘若工程较大,使用预编译头文件较好,加快编译速度。工程比较小,不推荐使用。但是创建预编译头文件后,第一次编译所花费的时间比后面的编译要稍微长些。
    2. 倘若.pch文件不小心丢失,只需要让编译器重新编译生成一个新的即可。
    3. 要确保放置在预编译头文件中的文件在工程开发时,不会被经常改变,否则的话,得不偿失。
  • 相关阅读:
    List<Map>中根据某个属性去重,不重复的值则覆盖null
    Jenkins的Master-Slave分布式构建
    Jenkins+Docker+SpringCloud微服务持续集成(集群版)
    Jenkins+Docker+SpringCloud微服务持续集成(单机版)
    Jenkins持续集成实战
    Python面向对象总结
    Python监控Redis脚本
    SnmpWalk获取服务器状态信息
    xclarity
    CNware
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/4536759.html
Copyright © 2011-2022 走看看