`
beckshanling
  • 浏览: 262809 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

【转】stdafx.h、stdafx.cpp的作用

    博客分类:
  • C++
阅读更多

stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h?

Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFC include文件。且这一文件可以随被选择的选项而变化。
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
◎当Visual C++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。 (扩展名pch表示预编译头文件。)
◎当Visual C++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。 Visual C++不再分析Windows include文件,除非你又编缉了stdafx.cpp或stdafx.h。
这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。) 在这个过程中你必须遵守以下规则:
◎你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h (后部)上,然后预编译stdafx.cpp。
◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。

 

 

 

http://topic.csdn.net/t/20040409/21/2947042.html

*备注一下*这是一个分享问题的问题需要用问题来回答出答案

我用 AppWizard 建立一个简单的名为 Hello 的 Project ,里面有 Hello.cpp ,StdAfx.h 和 StdAfx.cpp 这几个文件。
我发现 Hello.cpp 这个源文件中用了 #include "stdafx.h" 这个预处理命令包含了 StdAfx.h 这个文件;而 StdAfx.cpp 这个源文件也用了同样的预处理命令包含了 StdAfx.h 这个文件。因为编译器不会编译 *.h 头文件,因此建立一个名为 StdAfx.cpp 的 *.cpp 文件,这个文件的存在是为了编译一个预编译头文件,因为编译这类 *.h 头文件需要花费大量的时间,因此把 StdAfx.cpp 文件编译成一个预编译头文件,以后每一次编译的时候,就直接从硬盘里读取进行读取,以节省大量的时间。P.S. 所谓的预编译头文件和目标模块是一回事吧?
但是我现在 Hello.cpp 这个文件也用了 #include "stdafx.h" 这个预处理命令包含了 StdAfx.h 这个文件,因此我想编译器在进行预处理的时候会把 StdAfx.h 这个文件嵌入到 Hello.cpp 文件的特定的位置。因此在编译 Hello.cpp 的时候也会把 StdAfx.h 这个文件的源程序部会编译一遍,这会花费大量的时间。按照编译器在 Make 的时候所遵照的规则,即会比较文件的更新时间,对最近修改过的源文件进行编译,所以如果修改了 Hello.cpp ,那么编译器应该会把 Hello.cpp 这个源程序重新编译一次,同时也把嵌入其中的 StdAfx.cpp 文件部分编译一次。这样的话,还是花费了大量的时间,我没有看到 StdAfx.cpp 这个文件所编译成的预编译头文件在什么地方用到了,看不出来这个过程中怎么节省时间了。还有,既然已经把 StdAfx.cpp 文件编译成预编译头文件了,为什么还要在 hello.cpp 文件中用#include "stdafx.h" 这个预处理命令包含了 StdAfx.h 这个文件呢?既然已经包含了 StdAfx.h 这个文件了,那么为什么还要需要 StdAfx.cpp 文件,把它编译成
预编译头文件呢?这个预编译头文件和哪些文件连接呢?这个简单的工程中只有 Hello.cpp ,StdAfx.cpp 和 StdAfx.h 这几个文件,而 Hello.cpp 这个源文件已经包含了 StdAfx.h 文件,因此我觉得没有必要把用 StdAfx.cpp 文件编译成的预编译头文件和用 Hello.cpp 文件编译成的目标文件进行连接吧?
---------
学习 VC++ 中,总是被这一个问题所困惑。请大家指教。谢谢。

分享到:
评论

相关推荐

    stdafx.h stdafx.cpp

    在C++编程环境中,"stdafx.h" 和 "stdafx.cpp" 是两个非常重要的文件,尤其是在使用Microsoft Visual Studio等IDE时。这两个文件与预编译头(Precompiled Header)有关,是提高编译效率的一种技术。 首先,我们来...

    stdafx.h的作用

    `stdafx.h`是Visual C++开发环境中一个非常关键的头文件,主要作用在于优化编译过程,提高编译效率。它的出现主要是为了处理大量重复包含的系统和库头文件,尤其是MFC(Microsoft Foundation Classes)相关文件。MFC...

    MFC所包含的头文件stdafx.h及stdafx.cpp

    在MFC开发过程中,理解`stdafx.h`和`stdafx.cpp`的作用至关重要,它们是构建MFC程序的基础,并直接影响到项目的编译效率和可维护性。合理使用预编译头可以避免重复编译大量不常变动的代码,同时保持代码的清晰结构。...

    stdafx.h 头文件

    stdafx.h 头文件 很多时候c运行 提示找不到stdafx.h ,

    StdAfx.h头文件下载,编程必备!

    编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。 因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h...

    stdafx.h头文件探秘

    当使用Visual C++的AppWizard创建新项目时,默认会为项目自动生成`stdafx.h`和`stdafx.cpp`这两个文件。在`stdafx.h`中,可以指定需要预编译的头文件列表。例如: ```cpp // stdafx.h // #pragma once #include ...

    头文件stdafx.h

    在项目设置中,通常会指定一个源文件(如`stdafx.cpp`)来实际包含`stdafx.h`并生成预编译头。这个源文件通常只包含`#include "stdafx.h"`,然后编译器会根据这个文件生成预编译头。 在其他源文件中,我们通常会...

    C++中预编译头文件stdafx.h

    一些开发者倾向于避免使用`stdafx.h`,转而采用更现代的构建优化策略,如C++17引入的`<module>`,或者直接利用编译器的多核编译选项来加速编译。 总之,`stdafx.h`是C++在特定IDE环境下为了提高编译效率而引入的一...

    Stdafx.cpp

    Stdafx.cpp(Stdafx.cpp)Stdafx.cpp(Stdafx.cpp)Stdafx.cpp(Stdafx.cpp)Stdafx.cpp(Stdafx.cpp)Stdafx.cpp(Stdafx.cpp)Stdafx.cpp(Stdafx.cpp)

    stdAfx头文件(可以放到VC6.0头文件库中使用)

    在Microsoft Visual C++ 6.0 (VC6.0) 中,`stdAfx.h` 和 `StdAfx.cpp` 文件是预编译头文件(Precompiled Header File)的一部分,用于提高编译效率。预编译头文件的概念是C++编程中的一个重要特性,尤其是在大型项目...

    stdafx_h头文件

    编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。 因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h...

    StdAfx.cpp

    StdAfx.cpp

    stdafx头文件

    `stdafx.h`的主要作用是包含那些几乎在每个源文件中都会用到的标准库、自定义的全局声明以及特定的库引用。这样,编译器只需要预编译一次这些常见的包含文件,而不是在每个源文件中都重复这个过程。这显著减少了编译...

    stdafx的作用

    预编译头文件(Precompiled Header File)是Visual C++中一种提高编译效率的技术,主要通过`stdafx.h`和对应的`stdafx.cpp`文件实现。`stdafx.h`通常包含了经常被多个源文件共享且变动不频繁的头文件,如MFC...

    sxlb.rar_C 链表_C 双向链表_stdafx.h_双向链表_链表

    双向链表\qdlist.h 双向链表\stdafx.cpp 双向链表\stdafx.h 双向链表\双向链表.cpp 双向链表\双向链表.ncb 双向链表\双向链表.dsw 双向链表\双向链表.dsp 双向链表\双向链表.opt

    网狐6603内核引擎源

    网狐6603内核引擎源 ...Stdafx.h TCPNetworkEngine.cpp TCPNetworkEngine.h TCPSocketService.cpp TCPSocketService.h TimerEngine.cpp TimerEngine.h TraceService.cpp TraceService.h 文件名.bat 文件名.txt

    MFC经典程序.rar

    │ │ StdAfx.h │ │ Animate.opt │ │ │ └─RES │ Animate.ico │ Animate.rc2 │ AnimateDoc.ico │ Toolbar.bmp │ ├─18 BTNtest │ │ BtnTest.aps │ │ BTNTEST.CPP │ │ BTNTEST.DSP │ │ BTNTEST...

    CSpreadSheet类(含头文件.h和.cpp).rar

    CSpreadSheet类可对文件进行读写、修改等操作,并能逐位操作单元格,使用十分方便 注意事项: ...然后手动添加 CSpreadSheet.h 和CSpreadSheet.cpp进该项目工作区(插入、复制/粘贴 或者 直接包含即可)

    浙江大学WINDOWS编程课件及源程序

    │ StdAfx.h │ VC52.cpp │ VC52.dsp │ VC52.dsw │ vc52.h │ VC52.ncb │ VC52.opt │ VC52.plg │ ├─Vc62 │ 0011.ico │ 005159.ico │ icon2.ico │ ReadMe.txt │ resource.h │ Script1.aps │ Script1....

Global site tag (gtag.js) - Google Analytics