深度探索C++预编译头机制
深度详见预编译头,以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官方文档:预编译头】
相关文章:
深度探索C++预编译头机制
深度详见预编译头,以vs编译器实现的预编译头管理为例 预编译头是为了节省庞大的编译时间,采取的一种方法;C标准并没有规定如何实现预编译头机制;因此其具体实现方式由编译器供应商自行决定。 下面就以VS中观测的结果为例进行说明…...
Leaflet基础入门教程(一)
leaflet是一个前端的轻量的gis框架,为什么说它轻量呢。因为相比于传统的“庞大的”GIS框架比如openlayers和mapbox,leaflet不仅代码体积小,而且API构成也极为简单。是GIS行业小白入门级别学习的最好的框架,没有之一。 那么话不多说我们首先来学习一下如何使用leaflet搭建一…...
《强化学习导论》之6.5 Q-Learning
Q-Learning:Off-Policy TD Control强化学习的早期突破之一是开发了一种称为Q学习的非策略TD控制算法(Watkins,1989)。其最简单的形式,定义为(6.8)在这种情况下,学习的动作-值函数Q直接近似于最优动作-值函数࿰…...
5年软测,女朋友跑了俩,2年外包感觉自己废了一半,怎么办?
17年毕业,校招毕业就进入一家软件公司,干了2年的点工,随后进入一家外包公司工作至今,安逸使人堕落不知进取,加之随着近年的环境不景气,谈了多年将要结婚的女朋友也因为我的心态和工资要跟我闹分手我想改变现…...
【JavaWeb】HTML常用标签
HTML标签结构 HTML语言主要都是由标签构成的。 标签名 在 <> 中 如<body> 标签大部分成对出现,代表开始和结束 如 <body>标签中的内容</body> 少部分单个出现,叫单标签 </br> 代表换行 标签中可以加属性,多个…...
python编程:查找某个文件夹下所有的文件,包括子文件加下的所有文件,读取指定类型的文件
目录 一、实现要求 二、代码实现 三、效果测试 一、实现要求 1、在电脑上有一个文件夹,该文件夹下面还有子文件夹,具体层级不清楚,需要实现将该文件夹下所有的文件路径读取出来; 2、在1的基础上,只需读取指定类型的文…...
测试外包干了5年,感觉自己已经废了····
前两天有读者想我资讯: 我是一名软件测试工程师,工作已经四年多快五年了。现在正在找工作,由于一直做的都是外包的项目。技术方面都不是很深入,现在找工作都是会问一些,测试框架,自动化测试,感…...
C++17 文件与目录操作 <filesystem>
目录 路径操作 目录遍历 文件检查和操作 总结 每次写C进行目录操作时,我一般都是调平台的SDK,尤其是win32 api 非常难记,于是查一下文档看看有没有和Python中os模块一样好用的库。 于是发现 filesystem,从来没用过࿰…...
Python 如何安装 MySQLdb ?
人生苦短 我用python Python 标准数据库接口为 Python DB-API, Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库, 你可以选择适合你项目的数据库: GadFlymSQLMySQLPostgreSQLMicrosoft SQL Serve…...
总被程序员坑?你需要了解API接口
编辑导读:程序员是公司里的技术岗,也是产品经理最密切的合作伙伴。但是,程序员能看懂产品经理的工作,产品经理却不一定能明白程序员的工作,因此也常常被无良程序员坑。本文就从API接口的维度,浅析API的概念…...
信息系统基本知识(四)新技术
大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.5 新一代技术 1.5.1 物联网 概念:(The Internet of Things…...
jeesite多环境配置
jeesite多环境配置 参考网址: https://blog.csdn.net/shaoming314/article/details/129115912?spm1001.2014.3001.5501 开源项目地址: https://gitee.com/thinkgem/jeesite Spring Spring MVC mybatis Ehcache shiro mysql jsp (主要技术栈) 项目…...
项目中用到的知识点回顾---JWT(JSON Web Token)
1.JWT原理: JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,如下; {"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日…...
string类常用函数
1(substr函数):字符串截取函数,用于获取字符串的子串: //str.substr(begin,length),用于截取str中以begin为下标长度为length的字串 string s“asd”; ss.substr(0,1);//结果为a。 2(…...
hexo静态网站部署到腾讯云cos
hexo支持很多部署方案,最直接的就是部署在GitHub Pages服务上,国内gitee、coding等代码托管平台也都支持静态网站服务,而且免费。 但是GitHub在国内访问不太稳定,国内的代码托管平台资源和服务也不太稳定,后来想了想&…...
Python高性能编程
一、进程池和线程池 1.串行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import time import requests url_lists [ http://www.baidu.com, http://fanyi.baidu.com, http://map.baidu.com, http://music.baidu.com/, http://tieba.baid…...
MVVM模式下如何正确【视图绑定+数据】
概述 我如何(不在后面的代码中使用代码)自动绑定到我想要的视图?据我了解,如果正确完成,这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切,我甚至正确创建了一个资源字典(因…...
外包测试3年,离职后成功入职华为,拿到offer的那天我泪目了....
一提及外包测试,大部分人的第一印象就是:工作强度大,技术含量低,没有归属感!外包工作三年总体感受就是这份工作缺乏归属感,心里总有一种落差,进步空间不大,接触不到核心技术…...
Qt Study
按钮->点击->窗口->关闭窗口 connect(信号的发送者,发送具体信号,信号的接收者,信号的处理); 信号处理函数称为槽 信号槽的优点,松散耦合,信号发送端和接收端本身是没有关联的,通过connect连接…...
JS混淆技术探究及解密方法分析
随着Web技术的快速发展,JavaScript被广泛应用于网页开发、移动应用开发等领域。然而,JavaScript代码很容易被反编译、解密,这给保护网站和应用程序的安全性带来了严重的挑战。为了解决这个问题,JS混淆技术应运而生。JS混淆就是将J…...
智慧制硅厂 Web SCADA 生产线
我国目前是全球最大的工业硅生产国、消费国和贸易国,且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识,随着我国“双碳”目标的推进,光伏产业链快速发展,在光伏装机需求的带动下,…...
案例09-数据类型不一致导致equals判断为false
一:背景介绍 在判断课程id和班级id的时候如果一致就像课程信息进行更新,如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了,在判断的时候结果为false,就有插入…...
springsecurity中的类
Authentication AuthenticationProvider 每一个AuthenticationProvider对应一个Authentication 很多个AuthenticationProvider 由一个 ProviderManager管理 ProviderManager implements AuthenticationManager 一个ProviderManager有很多个 AuthenticationProvider Usern…...
k8s配置管理
一、configmap 1.1 configmap概述 Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。 1.2 configmap作用 我们在部署服务的时候,每个服务都有自己的配置…...
技术官方文档中的代码是用什么展示的?代码高亮插件总结
****内容预警****菜鸟教程***大佬绕道我们经常看到各种技术官方文档,有很多代码展示的区域,用于我们复制粘贴代码,比如vue 的官网当我们需要自己实现这么一个网站的时候,我就开始手忙脚乱,这到底是咋实现的?…...
2023年中职组网络安全竞赛——综合渗透测试解析
综合渗透测试 题目如下: PS:需求环境可私信博主,求个三连吧! 解析如下: 通过本地PC中的渗透测试平台KALI2020对服务器场景进行渗透攻击,获取到RSYNC服务所开放的端口,将RSYNC服务开放的端口数值进行MD5加密后作为FLAG提交(如MD5加密前:812);...
【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释)
题目链接 1044 火星数字 题目描述 火星人是以 13 进制计数的:地球人的 0 被火星人称为 tret。 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。 火星人将进位以后的 12 个高位数字分别称为:…...
rsync+xinetd+inotify+sersync
一、介绍 1.1、rsync 对比 scp 相同: 都有拷贝的功能不同: rsync:具有增量复制,每次复制的时候,会扫描对端是否在同路径下有我要发送的一样的文件或者目录,如果,如果存在,则不进行复制。边复制&…...
CSS - 扫盲
文章目录1. 前言2. CSS2.1 css 的引入方式2.2 选择器2.3 CSS 常用属性2.3.1 字体属性2.3.2 文本属性2.3.3 背景属性2.4 圆角矩形2.5 元素的显示模式2.6 盒子模型2.7 弹性布局1. 前言 上文我们简单 将 HTML 过了一遍 , 知道了 HTML 知识表示页面的结构和内容 &#x…...
ChatGPT能完全取代软件开发吗,看看它怎么回答?
最近网上一直疯传,ChatGPT 最可能取代的 10 种工作。具体包括①、技术类工作:程序员、软件工程师、数据分析师②、媒体类工作:广告、内容创作、技术写作、新闻③、法律类工作:法律或律师助理④、市场研究分析师⑤、教师⑥、金融类…...
菏泽网站建设公司/小程序
实战需求 我正在尝试将 Picker 和 macOS SwiftUI 应用程序中的 Menu 中的一些按钮组合起来。不幸的是 Picker 会自动折叠到子菜单中,我很难找到解决方案。如何防止 Picker 弃牌,或者可能有更好的解决方案? Menu("Budgets") {Picker("Budgets", select…...
wordpress的标签有什么用/seo整站优化多少钱
一、前言 时间子系统中的tick device layer主要涉及kernel/time/tick-*相关的文件,本文的主要内容就是从high level层次(不纠缠在具体的每行代码)描述tick device layer的运作逻辑。 如果说每个.c文件是一个模块的话,我们可以首…...
新人如何自学做网站/seo基础入门免费教程
点击上方“蓝色字”可关注我们!暴走时评:奥地利政府将使用以太坊区块链公证价值11.5亿欧元(约合13亿美元)的政府债券拍卖,联邦政府财政局(OeBFA)已指派银行业巨头Oesterreichische Kontrollbank…...
wordpress 能用的水印/网络推广好做吗?
导读 11月7日,以微信支付为核心微信智慧医疗服务再次创新,由微信支付与互联网团队联手推出医疗保险无纸化手机端快捷理赔,患者无需提供纸质材料,只需通过微信即可在线上快速完成医疗保险理赔。这也是微信首次打通商业保险&#x…...
唐山网站制作app/2023年最新新闻简短摘抄
文章目录前言一、四大基础理论1.拜占庭将军问题2.CAP 理论3.ACID 理论4.BASE 理论二、八大分布式协议和算法1.Paxos 算法2.Raft 算法3.Gossip 协议算法4.Quorum NWR 算法5.一致性 Hash 算法6.FBFT 算法7.POW 算法8.ZAB 协议总结前言 本文将系统介绍有关分布式有关的理论基础和相…...
新乡交友网站开发公司/上海发布微信公众号
满意答案uahyiw2020.02.11采纳率:51% 等级:11已帮助:6110人一.关机、睡眠的快捷键:1.先按左下角“windows“键,再按字母“U“键,再按字母“U”或“S”键。2.在桌面状态下按 ALTF4 再按“U”键或者“S”键…...