stdafx.h 的问题

sungengyu 2004-08-25 03:14:42
新建一个 test.cpp 文件 ,编译时提示
fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.

把 #include "stdafx.h" 加上 即通过编译。

然后把 #include "stdafx.h" 这行删掉
把 stdafx.h 中的所有内容 copy 到 test.cpp

编译提示错误: fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.


我的问题是:

1. 为什么 test.cpp 中一定要加上 #include "stdafx.h" ?
2. 为什么 #include "stdafx.h" 不能用 "stdafx.h" 文件中的内容代替?

谢谢。
...全文
307 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2004-12-17
  • 打赏
  • 举报
回复
:)

roselu 2004-12-16
  • 打赏
  • 举报
回复
谢谢 !
sungengyu 2004-08-26
  • 打赏
  • 举报
回复
谢谢大家
oyljerry 2004-08-25
  • 打赏
  • 举报
回复
网速有点慢,多发了一次
oyljerry 2004-08-25
  • 打赏
  • 举报
回复
VC++程序一般包含的头文件都比较复杂,如果每次都逐行分析可能会花很多时间,所以VC++默认设置是第一次编译时分析所有头文件,生成.pch文件,这个文件很大,但以后每次编译时就可以节省很多时间。如果删除了这个文件,下次编译时VC++会自动生成它。
StdAfx.h是每个MFC程序的类中必须包括的文件,它一般由AppWizard自动生成,包括编译MFC类所必须的定义。
oyljerry 2004-08-25
  • 打赏
  • 举报
回复
VC++程序一般包含的头文件都比较复杂,如果每次都逐行分析可能会花很多时间,所以VC++默认设置是第一次编译时分析所有头文件,生成.pch文件,这个文件很大,但以后每次编译时就可以节省很多时间。如果删除了这个文件,下次编译时VC++会自动生成它。
StdAfx.h是每个MFC程序的类中必须包括的文件,它一般由AppWizard自动生成,包括编译MFC类所必须的定义。
holyeagle 2004-08-25
  • 打赏
  • 举报
回复
预编译头文件的用处在于:一般MFC的程序都比较大,编译比较慢,但是,很多地方又是不会改的,所以,通过预编译,可以将一些不太容易变化的东西提前编译,节省的编译时间,提高效率。如果你的预编译头文件什么也没有,也可以不必指定预编译头文件,在项目设定的precom..file中选择NOne, 这样就可以不用包含了。
内存泄漏 2004-08-25
  • 打赏
  • 举报
回复
3)Unexpected end while looking for precompiled header
这时因为该模块没有包括预编译头文件“stdafx.h”的缘故。
VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这
样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有
一个很大的文件*.pch,这里就存储了预编译信息。
根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨“cannot open
precompiled header file debug/*.pch”。这时怎么解决这个问题呢,打开Project-》
Setting对话框选C++页,将Category下拉式列表框选中Precompiled Headers,最简单的
办法就是选中第一个选项“Not using....",这样就根本不用预编译头也不去寻找pch文件,
就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。
也可以选第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样
如果没有pch文件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“
智能”的。
第三个选项是强行创建一个pch文件,第四个选项是直接使用pch文件。当然“Through
headers”里都填stdafx.h了。

附赠一个小花招:
如果编译、连接时总出稀奇古怪的错误或者调试时单步执行走的代码都不符合自己的想法


因为你连接时一般都选用的incremental linking,每次增加一点,有可能把以前的错误
的东西留在连接出来的可执行文件里了。不如彻底重新编译、连接一遍。
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
DentistryDoctor(牙科医生) :


我想问一下:设置这个东西有什么好处?
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
是不是只要在"预编译中选项中"设置了要用 stdafx.h ,每个cpp 就都得包含stdafx.h ?
DentistryDoctor 2004-08-25
  • 打赏
  • 举报
回复
只要你选择了使用预编译头,就必须在每个CPP文件中包含相应的头文件(stdafx.h),要不不用预编译头。
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
原来在这:

Project Setting -> C++ -> category:Precompiled Heads -> Not using precompiled headers
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
但是 stdafx.h 中也没什么东西啊?

除了这一句外,其他的都可以删掉 :
#include <afxwin.h> // MFC core and standard components
DentistryDoctor 2004-08-25
  • 打赏
  • 举报
回复
我用的是VC7.1,C++/预编译选项下
VC6.0等一下呀,应该是在编译选项中的C/C++页下吧
ink8852 2004-08-25
  • 打赏
  • 举报
回复
在porject|settings|c/c++的Category中选择precompiled headers中选择not using precompiled headers 就可以了
行云边 2004-08-25
  • 打赏
  • 举报
回复
应该 跟语言没什么关系 ,是由编译器决定的吧
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
不明白。
to DentistryDoctor(牙科医生) :
在哪里设置的?

/* 这是因为在编译选项中设置了通过stdafx.中创建和使用PCH.(C++下的预编译头),如果编译选项中设置此头文件为其它文件,则需要包含你所设置的文件。 */

to hzhxxx(程序方程) :
1 . 一定要包含?
2 . 实现和声明不一样,那就要包含 stdafx.h ? 好像没什么必然联系啊! ?
/*1. 是 VC 的一个默认头文件,一定要包含的啊
2. 实现和申明不一样,这是 c++ 的规则*/


bm1408 2004-08-25
  • 打赏
  • 举报
回复
Project Setting->General->Not using precompiled headers

yes!
这就是这样!
windywalk 2004-08-25
  • 打赏
  • 举报
回复
stdafx.h是用于预处理的头文件
在Project setting 中C/C++的Project Options中有 /Yu"stdafx.h",
编译从预处理开始.
zhaogaojian 2004-08-25
  • 打赏
  • 举报
回复
根据老梁的<<编程高手箴言>>一书,要实现楼主的必须
Project Setting->General->Not using precompiled headers
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧