校园论坛网站建设论文,如何让百度收录网站,如何用ps做照片模板下载网站,陕西省住房和城乡建设厅深度详见预编译头#xff0c;以vs编译器实现的预编译头管理为例
预编译头是为了节省庞大的编译时间#xff0c;采取的一种方法#xff1b;C标准并没有规定如何实现预编译头机制#xff1b;因此其具体实现方式由编译器供应商自行决定。 下面就以VS中观测的结果为例进行说明…深度详见预编译头以vs编译器实现的预编译头管理为例
预编译头是为了节省庞大的编译时间采取的一种方法C标准并没有规定如何实现预编译头机制因此其具体实现方式由编译器供应商自行决定。 下面就以VS中观测的结果为例进行说明
预编译头的最小作用单位是文件单位 vs中可以通过设置项目属性页创建/Yc.使用/Yu以及不使用预编译头的方式管理预编译功能以项目属性页设置的方式默认对所有cpp文件生效 另外vs中也可以对某个cpp文件设置文件属性页的方式只对某一个文件设置是否创建使用预编译功能
pch文件为预编译头文件的输出文件就是这个文件节省了编译时间但是这个文件决不是二进制的obj文件包含机器码那么简单pch文件是二进制的某种符号表具体由实现决定C标准未指定
stdafx.h;stdafx.cpp;pch文件的关系: stdafx.h文件是一般所说的预编译头文件在vs中这个stdafx.h文件更像是一种标记 以cpp文件为单位如果指定了创建或者使用预编译头则编译时编译器会从cpp文件由上至下查找出现#include“stdafx.h”的位置这个位置之前的所有#include xxx 以及 stdafx.h位置本身都被看成是预编译的作用区 如果cpp文件不使用预编译头则该cpp是否#include“stdafx.h”都无所谓就算包含了#include“stdafx.h” 这个stdafx.h也被当作一个普通的头文件看待而不对其施加预编译功能机制
stdafx.cpp文件就是一个普通的cpp文件不参与预编译功能机制没什么特别的与其他cpp文件一样提供定义并生成目标object只是约定俗成的可以把在stdafx.h里面用户自己声明的函数对应的实现可以放在这个stdafx.cpp中当然也可以放在其他cpp中不叫这个名字总之没啥特别的
vs下创建/Yc和使用/Yu预编译头的区别 这二种方式的cpp都需要从头检测#include“stdafx.h”标记如果没检测到就报错
如果检测到了对于以使用方式的cpp文件将去寻找预编译头输出文件并且把#include“stdafx.h”标记位置之前的部分包括标记位置本身全部替换成预编译头输出文件pch而这个pch可以是其他以创建方式的cpp生成的 那么以这种组织方式的问题是这个被替换了预编译头的cpp包含了哪些声明符号完全是由替换后的pch决定而不是由标记位置上显示书写的#include决定这会造成编译器上看到是否能够编译成功与编译器的智能识别不一致 【简单来说就是显示include了可能会报未识别的标识符因为pch里面没有而没有显示include智能识别intelligence有问题但是pch里面有符号编译能通过】【这是一种垃圾组织方式】
没有全部cpp都以使用方式预编译头的情况因为必须要有pch生成使用方式不会生成pch只会替换pch
**若项目中的cpp文件有以创建方式预编译头也有使用方式预编译头则以创建方式预编译头的cpp文件只能有一个不能有多个**否则上面所说的cpp文件以使用方式触发的预编译替换机制失效 【因为只有一个创建预编译头的输出文件pch所以创建方式的cpp的include顺序肯定是同一的而其他以使用方式的cpp显示声明的include最终都要被替换这些cpp的include顺序就更无所谓了】
**如果所有cpp全都以创建方式预编译头**每个cpp依然还是要去寻找把#include“stdafx.h”标记并且整个项目只会生成一个pch文件但是这个标记和这个pch文件就像是“假的”一样不会发生预编译替换pch也不会被共同使用【事实上这种情况下生成pch到底是什么也不知道】 寻找标记和生成pch文件好像就是走个形式一样所有的cpp还是以他们自己显示声明的include 进行符号查找stdafx.h文件在这时候相当于一个普通的头文件 【简单来说这种情况形式上需要一个#include“stdafx.h”但是没有实际的预编译机制触发每个cpp符号查找以他们自己include的头文件为主甚至stdafx.h文件的位置都无所谓了因为根本没有实际的预编译功能触发此时stdafx.h就相当于一个普通的头文件】【这种情况下include顺序也就无所谓了】
采用预编译头时规范的组织方式: 虽然有预编译替换机制可以实现stdafx.h不一定非得出现在cpp最上方但是这种迷惑人的组织方式最好不要使用如果要使用预编译头最好的方式是把稳定的头文件include在stdafx.h文件的内部然后把stdafx.h放在cpp的最上方
vs预编译标头一致性规则 由于 PCH 文件包含有关计算机环境的信息以及有关该程序的内存地址信息因此应仅在创建 PCH 文件的计算机上使用该文件。【关于预编译头的一致性规则兼容等详细规则见msdn官方文档预编译头】