Visual C++程序中的#include “pch.h“是干什么用的?

2023-10-09 01:59

本文主要是介绍Visual C++程序中的#include “pch.h“是干什么用的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual C++程序中的#include "pch.h"是干什么用的?

很多初学者在用Visual C++编写程序的过程中,总会经常看到程序里有#include "pch.h"这么一句,会很困惑,有的人会觉得自己从没有写过这个句子,这句是哪里跑出来的?或者在看别人代码时,看到这么一句,莫名其妙这个句子是干什么用的。我们今天就来详细看一下这个Visual C++程序中的#include "pch.h"。

问题现象

我们经常在各种Visual C++的程序里看到这些东西:

#include "pch.h"
#include "father.h"
#include <iostream>
using namespace std;

这段代码中包含了一个名为pch.h的头文件,这个头文件我们用旧版的VS或者VC++6.0时根本没有见过,而且把这段代码复制到旧版的VS或者VC++6.0上运行,程序还会报错,因为旧版的VS或者VC++6.0找不到pch.h这个头文件。

如果在Visual studio 2022中删除#include "pch.h",程序会出现如下错误:

fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"?

这个报错就是你的代码开始没有加#include "pch.h"这个预编译头。遇到这种情况,解决方法如下,就是添加如下一个.h文件到项目中。

#ifndef PCH_H
#define PCH_H// TODO: 添加要在此处预编译的标头#endif //PCH_H

深入讲讲pch.h和pch.cpp

pch是一个在程序员创建项目时编译器自动生成的文件,称为预编译文件。打开pch.h,和pch.cpp,程序员会发现里面根本没有实质性的内容。

pch.h

#ifndef PCH_H
#define PCH_H// TODO: 添加要在此处预编译的标头#endif //PCH_H

pch.cpp

// pch.cpp: 与预编译标头对应的源文件;编译成功所必需的#include "pch.h"// 一般情况下,忽略此文件,但如果你使用的是预编译标头,请保留它。

是不是看起来很没有技术含量......

其实这两个文件一般情况下我们是用不到的,但是当程序员编写的代码中需要预处理的内容比较多时,可以把这些代码放在pch文件里。比如说,程序员写的程序中有大量宏定义的时候。

当然,我们在编写代码时,对常量进行宏定义是一种非常好的习惯,它有利于我们后期对代码进行维护和修改。我们可以把宏定义都放在pch.h文件里,对50进行宏定义,定义名为DDD,代码如下所示。

#ifndef PCH_H
#define PCH_H
#define DDD 50
// TODO: 添加要在此处预编译的标头#endif //PCH_H

这时在main函数所在的.cpp文件中添加#include"pch.h",就可以使用宏定义的符号DDD了。

#include "pch.h"
#include <iostream>int main()
{int i = 0;for (i = 0; i < DDD; i++) {printf("%d\n", i);}
}

下面说一个复杂一些的关于pch.h的例子。当你有一个函数,你经常需要调用它,这时可以把这个函数写到pch.cpp里,并在pch.h中给出函数的声明。

pch.h

//pch.h中对add()函数进行声明
#ifndef PCH_H
#define PCH_H
int add(int a, int b);
pch.cpp
//pch.cpp中写出add()函数的函数体
#include "pch.h"
int add(int a, int b) {return a + b;
}

study.cpp

#include "pch.h"	//包含此头文件,就可以调用add函数了
#include <iostream>int main()
{int study;study = add(5, 8);printf("%d", study);
}

进行一些代码或者宏定义的预处理是可以提高程序的执行效率的,但对于编写的比较小的程序来说,这点效率的提高可能根本感觉不出来,因此直接忽略#include"pch.h"就行了,放在那儿,不去管它,其余的代码该怎么写就怎么写。但如果我们非得想把这一行代码删除,可以这么做:

解决方案资源管理器窗口中,右键单击项目名称,然后选择“属性”以打开项目“属性页”对话框。在“ 配置 ”下拉列表中,选择“ 所有配置”。选择 “配置属性>C/C++>预编译标头 ”属性页。在属性列表中,选择 预编译标头 属性的下拉列表,然后选择“ 不使用预编译标头”。 选择“确定”以保存更改 。最后,就可以在原来的代码中把#include"pch.h"删除了。

总结

总结一下,将“pch.h”这个库函数里面的函数定义和实现包含到当前的C++代码中,使得当前代码中可以直接调用库函数“pch.h”中的所有公有函数。

include是一个计算机专业术语,一指C/C++中包含头文件命令,用于将指定头文件嵌入源文件中。

include包含指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c、.hpp、.cpp、.hxx、.cxx等,甚至.txt、.abc等等都可以。

预处理器发现 #include 指令后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include 指令, 就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。

下面列出C++中常用include头文件:

#include <assert.h> //设定插入点

#include <ctype.h> //字符处理

#include <errno.h> //定义错误码

#include <float.h> //浮点数处理

#include <fstream.h> //文件输入/输出

#include <iomanip.h> //参数化输入/输出

#include <iostream.h> //数据流输入/输出

#include <limits.h> //定义各种数据类型最值常量

#include <locale.h> //定义本地化函数

#include <math.h> //定义数学函数

#include <stdio.h> //定义输入/输出函数

#include <stdlib.h> //定义杂项函数及内存分配函数

#include <string.h> //字符串处理

#include <strstrea.h> //基于数组的输入/输出

#include <time.h> //定义关于时间的函数

#include <wchar.h> //宽字符处理及输入/输出

#include <wctype.h> //宽字符分类

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

这篇关于Visual C++程序中的#include “pch.h“是干什么用的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169527

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现