VC++编译器预编译头功能(stdafx.h)原理与实践

1 现象

在使用VC++应用向导生成的源码框架时,无论是MFC应用程序,还是Win32窗体程序,都会默认启用“预编译头”功能,自动生成stdafx.h和stdafx.cpp这两个文件。以后向项目中增加源文件时,也自动对该源文件启用“预编译头”功能。要求必须在.cpp文件开头加入 #include "stdafx.h" ,否则编译器就会报错:fatal error C1010:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include"stdafx.h"”?

2 预编译头功能的实现

参与“预编译头”功能的源文件分成三种:

(1)(指示头文件)预编译头指示文件,如常见的stdafx.h;

(2)(创建/Yc)预编译结果的来源文件,如常见的stdafx.cpp;

(3)(使用/Yu)使用“预编译头”的.cpp文件;该文件必须需要包含,#include "stdafx.h"。

需要注意的是,任何源文件都可能作为上面三种角色中的一种,文件的名字也不是固定为stdafx.h 以及 stdafx.cpp,而是可以随意修改的。但是实际使用时,往往采用默认设置就行了。

VC++在编译项目时:

(1)首先编译产生预编译头的源文件,编译结果就是 Projectname.pch 文件;

(2)然后编译其它.cpp文件,如果一个.cpp文件使用了预编译头功能,那么在编译它时,首先要寻找预编译头指示行。如果找不到就会报错;如果找到了,则并不会像对待其他头文件一样包含进来再编译,而是直接使用 Projectname.pch参与该cpp文件的编译;

3 启用与禁用“预编译头功能”

“预编译头”作为VC++编译器的一项特性,这个项目范围内可以启用,也可以禁用;也可以每个源文件单独启用或禁用。

3.1 在项目级别启用与禁用“预编译头”

如果使用VC++的应用程序向导生成Win32或者MFC项目框架,那么该项目就会默认启用"预编译头"功能。如果想在项目建立后禁用这个功能,需要在项目属性里设置,如下图所示:

在这里选择“不使用”就可以禁用预编译头功能了。一旦在项目级别禁用,则所有的原来“使用预编译头”的源文件都会不再使用预编译头了。

3.2 在单个源文件级别启用与禁用“预编译头”

有时候建立的项目启用了”预编译头功能”,但是后来导入了其他的第三方源代码,那么这些源代码文件在导入时会自动启用“预编译头”功能,而这些源文件却没有包含 #include "stdafx.h" 这一行,所以编译时就会报错。此时解决方法有两个,一是为每个源文件增加这个指示行;二是对该源文件禁用”预编译头“功能。要想单独禁用一个cpp文件的”预编译头“功能,只要在VS中右键单击它,然后打开“属性对话框”,在其中修改即可。如下图所示:

4 “预编译头”的由来

在编译时,头文件不会直接参与编译,而是在预处理时与cpp文件合并后再参与编译。有些头文件几乎是所有cpp文件都需要包含的,如<stdio.h>,<windows.h>等,这样这些文件就需要在每个包含它的cpp文件中重复编译。早些时候,这些头文件不大,重复编译也浪费不了多少时间。然而到了MFC出现的时候,其头文件变得超级大,如就一个<afxwin.h>就长达6000多行,这样重复编译这些长的头文件就会造成更长的编译时间。为了解决这个问题,VC++编译器把这些公共头文件事先单独编译,然后在编译包含它的cpp文件时,就直接使用头文件编译结果参与cpp文件的后续编译任务。这种“一次编译,多次使用”的方法,确实能减少编译时间。

5 我的选择

单纯使用VC++开发项目,使用“预编译头”功能,有百利而无一害。然而有时候,我们的源文件需要实现跨平台,而VC++之外的编译器并不支持这种功能,此时就需要这些源文件单独禁用这个功能。把第三方源代码集成到VC++项目时,也需要禁用“预编译头”设置(VS支持同时选中多个源文件,同时启用/禁用预编译头),当然如果不嫌麻烦,也可以每个源文件开头都加上 #include "stdafx.h"这一行。

时间: 2024-10-09 05:33:21

VC++编译器预编译头功能(stdafx.h)原理与实践的相关文章

预编译头文件 StdAfx.h

预编译头文件: 最常见的使用场景就是 StdAfx.h 文件,在这个文件中包含常用的头文件,比如windows.h,cstdio,string,别的 .cpp 文件去包含 StdAfx.h 头文件.编译的时候 StdAfx.h 尽管被多个 .cpp 包含,但只会编译一次.加快了编译速度. StdAfx.cpp 专门用来生成预编译文件,StdAfx.cpp 里只有一行代码 #include "StdAfx.h", 编译 StdAfx.cpp 会产生一个 .pch 文件.别的 .cpp 文

预编译头文件stdafx.h-stdafx.cpp-stdafx.pch(pre-compile headfile)

tdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展). 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H.Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果.这样可以加快编译速度,节省时间. 简介 编辑 预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是"pch",所以编译结果文件是

atitit.查看预编译sql问号 本质and原理and查看原生sql语句

atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look  gene  sql 2 1. Hb cfg all debug ,cant see... 2 2. WSExplorer按照进程抓取pack可以看见.. 2 3. Mysql 5.6 开放日志可以看见 2 4. Mysql and msssql的不同实现 2 4. MYSql的实现是jdbc连接完全的sql

VC++ 使用预编译头

一.使用默认的预编译头       要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件),想必大家都知道 StdAfx.h这个文件.很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件.其实不是的,这个文件可以是任何名字的.我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件.(因为AppWizard会为我们指定好如何使用预编译头文件,默认

浅谈VC++中预编译的头文件放那里的问题分析

用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx.h中的头文件才会有效果.如下: file: stdafx.h // stdafx.h : include file for standard system include files, // or project specific include files that are used freque

codeblocks + MinGW 以及vc 使用预编译头文件的方法

MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)”  你会看到一个多页面的属性框,选择“构建(build)”页面,将“编译文件(complie file)”选项勾上,其默认状态为没有勾 2.从菜单->工程(project)->构建选项(build options)  会跳出一个多页面属性框,在此你选择工程全局设置(project name),注意不是调试(debug)或者发布(release),然后“编译器

VC研究: 使用tinyxml编译出现“fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾”

向项目添加tinyxml用于解析xml内容,总体来说tinyxml还是很方便. 编译时提示"fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾" 分析: 此错误发生的原因是VC编译器在寻找预编译头文件(默认#include "stdafx.h")时,文件未预期结束.也就是没有找到默认的预编译头文件"stdafx.h".而VC中创建每一个cpp默认都会加上"stdafx.h",但添加的第三方类库(比如t

错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include &quot;stdafx.h&quot;”?(转)

错误分析: 此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束.没有找到预编译指示信息的头文件"stdafx.h".    (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的(选择了使用,就要在源文件中显式写上#include),但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)    我的这

VC++2013出现bug: 无法打开源文件“stdafx.h”

VC++2013出现bug: 无法打开源文件“stdafx.h” 1.首先需要把#include "stdafx.h"置于最头 2.在解决方案资源管理器中添加以下几个文件(附图下) 3.文件的内容分别为 ①.targetver.h #pragma once // 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台. // 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将// WIN32_WINNT 宏设置为要支持的平台,然后