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

c++预编译头文件

文章目录

    • c++预编译头文件
      • 1.使用g++编译预编译头文件
      • 2.使用visual studio进行预编译头文件
        • 2.1visual studio如何设置输出预处理文件(.i文件)
        • 2.2visual studio 如何设置预编译(初始创建空项目的情况下)
        • 2.3 visual studio打开输出编译时间

c++预编译头文件

预编译头文件(Precompiled Header,简称PCH)是一种提高编译速度的技术。在C++等编程语言中,每次编译程序时,编译器都需要处理所有的头文件。由于头文件通常包含大量的宏定义、类型定义和函数声明等内容,这一步骤可能会消耗较多的时间。尤其是当项目变得非常庞大且多个源文件共享相同的头文件时,这种重复处理会显著增加整个项目的构建时间。

预编译头文件的基本思想是将一些频繁使用的头文件预先编译成一种中间形式,然后在后续的编译过程中直接使用这个已经编译好的结果,而不是每次都从头开始重新解析这些头文件这样做可以大大减少编译时间,尤其是在大型项目中效果尤为明显

  • 使用预编译头文件的好处包括
  1. 加速编译过程:减少了对常用头文件内容的重复解析。
  2. 提高开发效率:更快的编译反馈循环可以让开发者更高效地工作。
  3. 资源节约:降低了CPU和内存的使用量。

如何使用预编译头文件

不同IDE或编译环境对于预编译头文件的支持方式可能有所不同。以下是一些常见的设置方法:

  • Visual Studio (VS): 在VS中,可以通过项目属性来指定一个特定的头文件作为预编译头。一般需要创建一个专门用于预编译的头文件(例如stdafx.h),并在项目设置里指定该文件为预编译头文件。同时,还需要在源代码文件顶部加入#include "stdafx.h"作为第一个包含指令。
  • GCC/Clang: 这些编译器通过命令行选项支持预编译头文件。例如,使用-Winvalid-pch来生成预编译头文件,然后用-include选项指定要包含的预编译头文件。
  • Xcode: Xcode也支持预编译头文件,并且可以通过项目的Build Settings进行配置。

需要注意的是,虽然预编译头文件能够显著提升编译速度,但不恰当地使用也可能导致问题,比如增加了编译器之间的依赖性,或者使得某些编译错误难以定位。因此,在实际应用中应当根据项目实际情况合理选择是否以及如何使用这项技术。

下方两个文件其实是等价的

在这里插入图片描述

在这里插入图片描述

  • 上图中下方代码分离出我们需要的头文件单独到一个文件中,方便我们进行头文件预编译

1.使用g++编译预编译头文件

  • 分别测试第一次编译,再修改部分代码进行第二次编译,两次编译时间如下

在这里插入图片描述

  • 直接对分离出的pch.h文件进行编译,我们一般对cpp文件编译,但对头文件编译就会生成下方截图所示文件。

在这里插入图片描述

  • 将之前生成的exe文件删除,重新对main.cpp进行编译,分别测第一次编译时间,然后修改部分代码再次重新编译第二次,我们发现两次时间都大大减少。

在这里插入图片描述

2.使用visual studio进行预编译头文件

2.1visual studio如何设置输出预处理文件(.i文件)
  • 右击项目,设置属性

在这里插入图片描述

  • 选择预处理器,将预处理到文件改为是

在这里插入图片描述

  • 这样运行的程序文件下就会出现.i文件,打开.i预处理文件,如下,可见加入的那些头文件代码量之多,这些都要重新编译(如果不进行预编译头文件的话)
    在这里插入图片描述
2.2visual studio 如何设置预编译(初始创建空项目的情况下)
  • 进行预编译:
    • 创建pch.cpp,引入pch.h文件,右击cpp文件选中属性:

在这里插入图片描述

  • 选择预编译头,改为创建

在这里插入图片描述

  • 再右击项目属性,设置项目属性。选择使用预编译头,并且选择预编译头文件

在这里插入图片描述

在这里插入图片描述

2.3 visual studio打开输出编译时间
  • 选择工具,打开选项。

在这里插入图片描述

  • 找到vc++ 项目设置,把生成计时改为是。

在这里插入图片描述

  • 一开始项目设置属性预编译头为不使用预编译头的情况:
  • 第一次编译:在这里插入图片描述
    改代码后第二次编译情况如下在这里插入图片描述
  • 将项目属性设置为使用预编译头后:
    • 第一次编译情况如下:(跟不使用的差不多)在这里插入图片描述
  • 改写部分代码后第二次进行编译,情况如下:(第二次时间大大减少)在这里插入图片描述

相关文章:

c++预编译头文件

文章目录 c预编译头文件1.使用g编译预编译头文件2.使用visual studio进行预编译头文件2.1visual studio如何设置输出预处理文件(.i文件)2.2visual studio 如何设置预编译(初始创建空项目的情况下)2.3 visual studio打开输出编译时…...

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…...

电子课程开发中的典型误区

创建一个有效的电子课程需要仔细的规划和执行,但常见的错误可能会破坏其成功。以下是开发人员应该避免的一些典型陷阱: 1.缺乏明确的目标 如果没有明确的学习目标,课程可能会缺乏重点,让学习者不确定自己应该实现什么。明确、可衡…...

Docker 逃逸突破边界

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何…...

残差连接,就是当某一偏导等于0时,加上x偏导就是1,这样乘以1保证不失效

目录 残差连接,就是当某一偏导等于0时,加上x偏导就是1,这样乘以1保证不失效 残差连接中F(x)一般代表什么,将F(x)变为F(x) +x,这样不是改变了函数 本身的性质 F(x)=F(x) +x F(x)偏导若==0;偏导连乘就是0,这样就梯度消失了 F(x) +x;求偏导时x导数是1,保证不丢失F(x)…...

博泽Brose EDI项目案例

Brose 是一家德国的全球性汽车零部件供应商,主要为全球汽车制造商提供机电一体化系统和组件,涵盖车门、座椅调节系统、空调系统以及电动驱动装置等。Brose 以其高质量的创新产品闻名,在全球拥有多个研发和生产基地,是全球第五大家…...

从科举到高考,人才选拔制度的变革与发展

一、引言 在人类历史的长河中,人才选拔机制始终是推动社会进步与文明传承的关键环节。古代科举制度与现代高考制度,分别在各自的时代背景下承担着筛选人才的重任,二者虽皆关乎教育与人才进阶之路,却有着诸多本质性的区别与独特的…...

利用Docker一键发布Nginx-Tomcat-MySQL应用集群

Docker简介,可以看上一篇文章: 为什么互联网公司离不开Docker容器化,它到底解决了什么问题?-CSDN博客 Docker体系结构 docker核心就是镜像和容器: 镜像就是应用程序的安装文件,包含了所有需要的资源&…...

关于数据库数据国际化方案

方案一:每个表设计一个翻译表 数据库国际化的应用场景用到的比较少,主要用于对数据库的具体数据进行翻译,在需要有大量数据翻译的场景下使用,举个例子来说,力扣题目的中英文切换。参考方案可见: https://b…...

【系统架构设计师】高分论文:论信息系统的安全与保密设计

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 本人所在工作单位承担了我市城乡智慧建设工程综合管理平台项目的开发工作。我有幸参与了本项目,并担任架构师一职,全面负责项目的需求分析和系统设计等工作。城乡智慧建设工程综合管理平台项目包括…...

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载,已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd,键入rustc --version,出现 rust 版本号&…...

【docker】docker compose多容器部署

Docker Compose 的详细讲解与实际应用 什么是 Docker Compose? Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用。 通过一个 docker-compose.yml 文件,可以同时启动多个服务,简化多容器管理。 Docker Compose 的核心…...

JS +CSS @keyframes fadeInUp 来定义载入动画

JSCSS 更完美展现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>跳动加载指示器</title>&l…...

Seatunnel解决ftp读取json文件无法读取数组以及格式化之后的json无法解析的问题

问题原因 在JsonRead这个方法里面 在源码中使用的逻辑是读取一行 然后把这个json进行解析 但是这样存在一个问题 比如如果json的格式是这样的 { name&#xff1a;“zhangsan”&#xff0c; age&#xff1a;25 } 如果是这样的话 第一行读到的内容就是 { 显然 一个 { 并不是一个…...

Elasticsearch在liunx 中单机部署

下载配置 1、下载 官网下载地址 2、上传解压 tar -zxvf elasticsearch-XXX.tar.gz 3、新建组和用户 &#xff08;elasticsearch 默认不允许root账户&#xff09; #创建组 es groupadd es #新建用户 useradd ryzhang -g es 4、更改文件夹的用户权限 chown -R ryzhang …...

深入探索 HarmonyOS 的 Navigation 组件:灵活的页面管理与动态导航

在移动应用开发中&#xff0c;页面的跳转和导航一直是核心功能之一。对于 HarmonyOS 开发者来说&#xff0c;Navigation 组件提供了一个强大的工具来实现灵活的页面管理和导航体验。今天&#xff0c;我们将深入探讨如何使用 HarmonyOS 中的 Navigation 组件来管理页面跳转、工具…...

【CUDA】CUDA Hierarchy

【CUDA】CUDA 基本概念和 Hierarchy CUDA 编程基础&#xff1a;Host 和 Device 工作流程 首先简单介绍CUDA 编程的基本概念&#xff1a;讲解 Host&#xff08;CPU&#xff09;与 Device&#xff08;GPU&#xff09;的区别、内存管理以及 CUDA 运行时的工作机制。 Host&#x…...

28.100ASK_T113-PRO Linux+QT 显示一张照片

1.添加资源文件 2. 主要代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QImage> #include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QIm…...

GitLab使用中遇到的一些问题-记录

错误内容一 Warning: Permanently added gitlab.com (ED25519) to the list of known hosts. gitgitlab.com: Permission denied (publickey). Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. …...

【微服务】Docker

一、Docker基础 1、依赖的兼容问题&#xff1a;Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离。 2、如何解决开发、测试、生产环境有差异的问题&#xff1a;Docker镜像…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...