当前位置: 首页 > news >正文

C++ 预编译头文件

1、解决什么问题?

  C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元。编译单元是一个自包含文件,C++编译器对编译单元进行编译。考虑,头文件A.h被多个cpp文件(比如A1.cpp,A2.cpp)包含,每个cpp文件都要进行单独编译,其中的A.h部分就会被多次重复第编译,影响效率。

2、怎么解决?

  把A.h以及类似A.h这样的头文件,包含到stdafx.h中(当然也可以是其他文件),在stdafx.cpp中包含stdafx.h,设置stdafx.cpp文件的属性,预编译头设置为 创建。对于原先包含A.h的cpp文件,删除#include "A.h",改成包含stdafx.h,同时设置这些cpp文件(A1.cpp,A2.cpp)的属性,预编译头设置为 使用。这样的话,下次编译A1.cpp,A2.cpp的时候,对于A.h头文件中的那部分,就不需要编译了,节省时间。

3、预编译头文件原理

  工程对预先编译的代码进行编译,会生成一个pch文件(precompiled header),包含了编译的结果。注意,可以对任何代码生成到pch中,但是生成pch是个很耗时的操作,因此,只对那些稳定的代码创建预编译头文件。

4、对于预编译头,分为:创建者,使用者,不使用者。

5、注意:现在的编译器都有Time Stramp 功能,当编译整个工程的时候,只编译那些修改的cpp文件。但是,这并没有解决上面提到的问题。考虑A1.cpp经常修改,每次修改,都要对包含的A.h头文件部分,进行编译。

6、Time Stramp:时间戳是指文件属性里的创建,修改,访问的时间。每次,文件内容修改,时间戳都会更新为最新的时间,时间戳发生变化,说明文件被修改了。

补充说明:时间戳往往应用在同步,比如音频视频不同步。举例来说,A,B两个人约定在一起,7点干什么,8点干什么,9点干什么,如果在7点没有同步,就算了,尽量保证8点同步。也就是说,同步是动态的过程,当不同步时,一个等待,一个追赶,保证下一个时间点同步。

相关文章:

  • C#学习笔记(七)——定义类
  • C#学习笔记(五)——函数
  • Google CEO 定义 Web 3.0
  • 判断字符串是否是回文字符串或者是否含有回文字符子串 (我是从两颗番茄的博客看的题目,然后自己编的) 不断学习!!...
  • DICOMDIR结构
  • MVC2 Area实现网站多级目录
  • IBM Java多线程 - 4.共享对数据的访问
  • TADOQuery池
  • Windows7问题集
  • 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
  • 应用开发框架之——业务规则脚本化
  • 对等计算实践: P2P 遇上 SSL
  • Sprout and the Bean
  • 数据库水平拆分和垂直拆分区别(以mysql为例)
  • 跟我一起学WCF(11)——WCF中队列服务详解
  • CentOS 7 防火墙操作
  • Java的Interrupt与线程中断
  • JS基础之数据类型、对象、原型、原型链、继承
  • leetcode讲解--894. All Possible Full Binary Trees
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python socket服务器端、客户端传送信息
  • python3 使用 asyncio 代替线程
  • rabbitmq延迟消息示例
  • select2 取值 遍历 设置默认值
  • Selenium实战教程系列(二)---元素定位
  • Spring Boot MyBatis配置多种数据库
  • vue学习系列(二)vue-cli
  • 阿里研究院入选中国企业智库系统影响力榜
  • 不上全站https的网站你们就等着被恶心死吧
  • 漂亮刷新控件-iOS
  • 前端
  • 使用 Docker 部署 Spring Boot项目
  • 使用docker-compose进行多节点部署
  • 手写一个CommonJS打包工具(一)
  • 系统认识JavaScript正则表达式
  • 一道面试题引发的“血案”
  • 找一份好的前端工作,起点很重要
  • 阿里云ACE认证之理解CDN技术
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (31)对象的克隆
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (bean配置类的注解开发)学习Spring的第十三天
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)linux 命令大全
  • (转)Mysql的优化设置
  • .gitignore文件设置了忽略但不生效