VC++6中的预编译头

C++预编译头文件 本文主要C++中的“预编译头文件”技术,内容包括该技术的概述、作用、适用场景、使用方法、例子等。 阅读详情

VC++6中的预编译头

预编译头的概念:

在很多程序中,每个源文件都存在一些相同的部分。比如要包括相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microsoft Visual C++提供的“预编译头文件”机制就支持这一功能。

所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件。这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。

也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。

预编译头的使用:

方法一:手动方法

要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)

想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:

#include <afxwin.h>     // MFC core and standard components

#include <afxext.h>     // MFC extensions

#include <afxdisp.h>   // MFC Automation classes

#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls

#include <afxcmn.h>  

这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。

那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已―――也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project ->Setting->C/C++ 对话框。把Category指向Precompiled Header。

在Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名就是PCH)。

这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。

在这里,Precomplier 选择了 Use ………一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,/Yu”stdafx.h”。

这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以下是注意事项:

1):
如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果…..

2
)如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍就可以了。当然你可以傻傻的 Rebuild all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。


方法二:自动使用

很简单只要指定/YX就可以了。或者在上图中选择Automatic………就可以了。注意的事情是如果你指定了/Yc /Yu的话,/Yx是会被忽略的。前者的优先级别高一些.

 

下面从另一个角度再看一下:

假设每个源文件的相同部分都出现在文件的开始部分。这一假设是很现实的。那么相同部分的结尾如何定位呢?由两种方法,一是由程序员在源文件中用#pragma hdrstop标记;二是指定对某个头文件的包含指示符(#include directive)作为结束标志。这个头文件被称为through header file,在/Yc或者/Yu命令参数中指明。

 

在编译第一个源文件时,将从文件头到预编译部分结束处的编译结果存储到一个预编译头文件中,扩展名通常是pch。这个过程称为预编译头文件的生成。这一步工作需要指定/Yc参数。在对其他源文件进行编译时,使用这个预编译头文件,此时用/Yu参数。生成的预编译头文件的名字通过/Fp参数指定。

 

下面举一个例子。假设Project中共用的宏定义,常量定义,头文件引用都放在prechdr.h中。我编辑一个prechdr.cpp来#include “prechdr.h”。对prechdr.cpp编译时就可以生成包含prechdr.h中内容的预编译头文件:

 

cl /Ycprechdr.h /Fp./Debug/prechdr.pch prechdr.cpp

 

这样,就创建了prechdr.pch。在编译其他源文件时,使用prechdr.pch:

 

cl /Yuprechdr.h /Fp./Debug/prechdr.pch others.cpp

 

在IDE中,可以将Project Settings设置成/Yuprechdr.h /Fp./Debug/prechdr.pch。然后将prechdr.cpp的C++ tab中Precompile类别设置成Use precompiled header,即在使用Project Settings的基础上增加了/Yc参数。当/Yc和/Yu共存时,只有/Yc起作用。IDE在build Project时会最先编译prechdr.cpp以创建预编译头文件供其他源文件使用。 

做了一个在MFC的工程中编译C文件的实验 主要是为了验证各种情况下,VC++6.0报错的内容。实验背景见下图:(1)建立一个MFC AppWizard工程(2)TstExtn.h中的内容(3)TstExtn.c中的内容(4)在一个CPP文件中调用C文件中的函数(5)去掉TstExtn.c的预编译头第一步是,不定义大写BOOL的类型(注:MFC中将大写BOOL定义为int型)因为按照C语言 阅读详情

相关推荐

VC++6.0传奇2.0源码解析:从MMORPG架构到编译调试实战

网络游戏开发的核心在于构建稳定、可扩展的服务器架构与高效的客户端交互系统。其基本原理涉及客户端-服务器模型,通过Socket通信实现状态同步,并采用数据库进行数据持久化。在技术实现上,早期大型多人在线游戏常使用IOCP(完成端口)模型处理高并发连接,并依赖DirectDraw等图形接口进行2D渲染,这些技术对理解底层游戏引擎运作具有重要价值。从工程实践角度看,分析一套完整的MMORPG源码,如基于VC++6.0开发的传奇服务端与客户端,能直观展示网络封包设计、游戏逻辑分离、资源管理等模块的具体实现。本文聚焦

weixin_30430677的博客 295

VC++6中的预编译头

预编译头的概念:在很多程序中,每个源文件都存在一些相同的部分。比如要包括相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microso

ArenAK--图形与编程 2336

VC++ 6.0 SP6完整开发套件(含中英文版+权威MSDN文档)

—它在.NET框架诞生前夜,以零托管依赖、全静态CRT链接、裸金属级API控制力,定义了C++在Windows平台上的“系统级表达权”。其技术本质在于。

weixin_36487018的博客 246

关于VC6.0的预编译

                                                                           关于VC6.0的预编译       前几天有个QQ上的好友问我关于MFC中的WinMain()函数哪去了的问题,我只能说是MFC系统自动连接进去的,我还给了他一个设置了断点的工程文件,其中可以执行到_tWinMain()那儿停下来验证。然后他又问

Alex的学习之路 2540

PR控制以及使用PR控制用于单相离/并网逆变器

最近想学习一下并网逆变器,需要用到PR控制,全网找遍了许多学习资料,终于掌握的差不多了,在此做个记录,以及个人对PR(Proportional Resonant)控制的理解。在去年7月准备电赛的时候偶然看到有几篇讲解数字滤波器,第一次接触传递函数离散化,深刻被数字时代的数字方式折服,改改代码,就可以实现不同的截至频率,甚至不同阶数,而模拟方式还要改元器件。当时就感觉这玩意太他妈牛逼了,很想学懂它,奈何学不会呀。后面全身心做电赛,就忘了这事儿。直至最近学习PR控制,当初的感觉又回来了,一股劲儿吃下来了。

xht2403267701的博客 3万+

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5125

带你玩转Visual Studio——带你理解微软的预编译头技术

所谓头文件预编译技术,就是把一个工程(Project)中常用的一些头文件(如标准头文件Windows.h、Afxwin.h等,也可以是自己定义的头文件)包含在stdafx.h中,并对stdafx.h预先编译(在所有的.cpp文件编译之前进行编译),得到编译结果.pch文件(默认名称为ProjectName.pch),后期该工程在编译其它.cpp文件时不再编译stdafx.h中的内容(即使include了它),仅仅使用

阳光日志 2万+

服务器卡死排查实战:从现象分类到根因定位的完整手册

服务器卡死是运维中最令人头疼的故障之一,从游戏圈吐槽的“土豆服务器”到生产环境中的Linux系统无响应、rsync复制挂起,本质都是系统或进程失去正常响应能力。其原理通常涉及CPU、内存、磁盘IO或网络资源耗尽,以及内核和驱动异常。掌握系统化的排查方法,能够帮助工程师快速定位根因、缩短故障时间,避免盲目重启。本文从资源、层级、场景等多维度分类,结合top、dmesg、strace等工具,梳理一套从现象确认、指标收集、日志分析到进程定位的实战排查流程,并覆盖常见高频场景与预防治理建议。无论你是运维新手还是老手

weixin_33851177的博客 374

预编译头文件详解

一、预编译头的概念、作用 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。 预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.

yupei881027的专栏 2065

b站up“麦辣翅翅”《YOLOv8修改损失函数》问题解决RuntimeError: The size of tensor a (4) must match the size of tensor

b站up“麦辣翅翅”《YOLOv8修改损失函数》问题解决RuntimeError: The size of tensor a (4) must match the size of tensor ;TypeError: bbox_iou() got an unexpected keyword argument 'xywh‘

weixin_68331871的博客 3020

WRF中使用ERA5再分析数据

   本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ......

GIS 8169

VC++6.0中的预编译头

在很多程序中,每个源文件都存在一些相同的部分。比如要包括相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microsoft Visual

1232

PADS Logic VX2.5元件绘制全流程:从零开始创建自定义元件库

本文详细介绍了在PADS Logic VX2.5中从零开始创建自定义元件库的全流程。内容包括理解PADS独特的四库分立结构、绘制原理图符号(CAE封装)、关联PCB封装、创建元件类型以及最终的调用验证。掌握元件绘制技能能从根本上提升设计效率、确保设计规范统一,并从源头杜绝原理图与PCB之间的关联错误,是硬件工程师必备的核心能力。

oo7890的博客 441

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1853 “.\Release\basic_sample.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它

该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++中,默认的预编译头文件是针对 C++ 的 (stdafx.h和 stdafx.cpp),当然也可以创建针对 C 的预编译头。 方法: 将少数的不同类文件设为不使用预编译头是比较平衡的做法 对于VC++6.0,在 File...

weixin_38226226的博客 5823

Linux云服务器上搭建《僵尸毁灭工程》私服全流程指南(避坑版)

本文详细介绍了在Linux云服务器上搭建《僵尸毁灭工程》私服的全流程指南,包括环境准备、SteamCMD安装、游戏服务器部署、内存优化配置及高级调优技巧。特别针对常见问题提供解决方案,帮助玩家快速搭建稳定的私服环境。

solidity8miner的博客 601

Python爬虫实战:利用最新技术高效爬取百度贴吧帖子内容

本文将详细介绍如何使用Python最新技术栈构建一个高效的百度贴吧爬虫,包括requests-html异步请求、BeautifulSoup4解析、数据存储到MongoDB以及应对反爬机制等完整解决方案。文章包含5000余字详细教程和完整代码实现。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。Python凭借其丰富的库生态系统成为爬虫开发的首选语言。贴吧作为中文互联网最大的兴趣社区,包含大量有价值的UGC内容。动态加载内容处理登录状态维持。

2201_76125261的博客 540

fatal error C1010: unexpected end of file while looking for precompile

在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive 的错误.解决方法:1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Preco

每天多一分钟学习,生命就多一份精彩 2211

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

fatal error C1010: unexpected end of file while looking for precompiled header directive

在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive 的错误. 解决方法:如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中P

Unimen的专栏 789

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中头文件编译错误:fatal error C1010:“unexpected end of file while looking for precompiled header directive"

(1). [Project] - [Settings] - [C/C++] - [Category] (2). 选择 [Precomplied Headers] (3). 单选 [Not Using Precomplied Headers] (4). [OK]

·没有风雨躲得过,没有坎坷不必走· 2717

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC++ 6.0深度指南:从核心架构到现代项目维护实战

集成开发环境(IDE)是程序员的核心工具,其设计哲学深刻影响着开发效率与工程实践。理解IDE的底层原理,尤其是其工程模型、编译系统和调试器工作机制,对于掌握软件构建本质至关重要。在C++开发领域,Visual C++ 6.0作为一个历史悠久的经典环境,其一体化工作区(Workspace)与工程(Project)模型、基于NMake的编译流程,以及高效的预编译头技术,至今仍是理解Windows平台C++开发基础的重要案例。尽管其界面复古且原生不支持现代C++标准,但它在国内高校教育、遗留系统维护等特定场景中仍

weixin_33701617的博客 421

VC++ 6.0项目创建与配置全解析:从控制台应用到MFC开发

C++作为经典的面向对象编程语言,其开发环境经历了从命令行工具到集成开发环境的演进。Visual C++ 6.0作为上世纪90年代末的主流IDE,虽然已停止更新,但其轻量级特性和对MFC框架的深度支持,在处理遗留系统维护和特定工业控制场景中仍有不可替代的价值。通过理解其项目创建流程、编译链接机制及运行时库配置原理,开发者能够有效解决历史代码的兼容性问题。本文以VC++ 6.0为切入点,详细演示了控制台应用、MFC应用程序和动态链接库的创建过程,并深入解析了项目配置中运行时库选择、预编译头优化等关键技术细节,

weixin_42526166的博客 249

【转】fatal error C1010: unexpected end of file解决方案

在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive问题详细解释:致命错误C1010,在寻找预编译指示头文件时,文件未预期结束。就是没有找到预编译指示信息的头文件。问题一般发生在:通过添加文件的方式,添加了一些cpp文件

volkswageos的专栏 1092

Visual Studio下找不到某些VC++6.0自带头文件的解决思路 - fstream.h为例

最近实验很多,忙不过来,快累死了。。。   文章出自 - www.wangcongyu.com /****************************************问题分析********************************************/ 做三维动画设计实验时,老师给了一些代码。其中一个功能是是利用OpenGL和GLUT库实现一个标准的MD3文件读

3088

vc 6.0常见编译错误及改正方法

最常见VC++6.0编译错误信息集合 1、fatal error C1010: unexpected end of file while looking for precompiled header directive。 寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h") 2、fatal error C1083: Ca...

weixin_33881050的博客 973

VS2015+win10SDK安装

2、sprintf不能用时,将#pragma warning(disable : 4996)插入到cpp文件第一行;VS2015默认安装win8SDK,好像不能编Console程序。故需采用VS2015+win10SDK。1、项目属性目标平台版本设为:10.0.14393.0。3、C/C++预编译头中可能要选择“不使用预编译头”;

lecturekeke的专栏 1256

VC的若干实用小技巧,大家分享

将本人刚刚找到的一些VC的使用技巧贴出来,大家分享 Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 1:使用vc开发项目时,常会遇到这种情况: 即明明只改动了一个文件,却要把整个项目全部重新编译连接一次。刚刚连接好,一运行...

weixin_34395205的博客 151
上一篇: 关于预编译头
下一篇: VC中预处理指令与宏定义的妙用
sunjd2001
博客等级 码龄20年 30粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值