头文件stdafx.h的作用(常见错误),以及如何在空项目中添加该头文件

这篇具有很好参考价值的文章主要介绍了头文件stdafx.h的作用(常见错误),以及如何在空项目中添加该头文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


预编译头文件 stdafx.h

stdafx.h 是微软自己搞的预编译机制中的一个默认文件,里面填写代码用到的h文件, 而vs在编译代码时,会把 stdafx.h 里面提到的h进行预先编译,缓存起来,当用户不更改stdafx.h 里面内容时,则不重新编译这些h,这样会让你更加高效地进行反反复复的run/debug操作。
当你把vs工程设置成 [不使用预编译机制]时,可能会导致每次调试运行的时候,编译速度变慢。

最常见的使用场景就是 stdafx.h 文件,在这个文件中包含常用的系统头文件,比如windows.h,cstdio,string,因为这个头文件不会经常改变(修改),会给很多.cpp文件使用,这样只需要让别的 .cpp 文件去包含 stdafx.h 头文件就行了;如果随意改动 stdafx.h 文件的话,整个程序就会重新编译一遍
编译的时候 stdafx.h 尽管被多个 .cpp 包含,但只会编译一次,这样就加快了编译速度。
stdafx.cpp 专门用来生成预编译文件,stdafx.cpp 里只有一行代码 #include “stdafx.h”, 编译 stdafx.cpp 会产生一个 .pch 文件。别的 .cpp 文件编译的时候就会使用这个 .pch 文件。

想要取消VS2012自动生成的#include“stdafx.h”,只要将选项改为:【不使用预编译头】就行了。


fatal error C1083: 无法打开包括文件:“stdafx.h”: No such file or directory

有时候我们的.cpp文件和stdafx.h头文件不在同一级目录下,只需要修改#include "stdafx.h"的路径为相对路径即可
例如修改为#include “…\stdafx.h”,这是由于stdafx.h在该.cpp文件上一级目录里面;
如果在该.cpp文件上两级目录里面的话,就修改为者#include "…\stdafx.h"即可。


fatal error C1083: 无法打开预编译头文件:“Debug\Win32RegistryClass.pch”: No such file or directory

头文件stdafx.h的作用(常见错误),以及如何在空项目中添加该头文件
这个错误是当我的.cpp文件预编译头设置的是“使用 (/Yu)”导致的,当我将上图其中随便一个.cpp的预编译头设置为“创建 (/Yc)”的时候,编译就通过了。


warning C4627: “#include “…\stdafx.h””: 在查找预编译头使用时跳过

解决方法:
打开编译错误的.cpp文件,将#include "stdafx.h"添加到第一行(必须是第一行)。


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

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

当我们的项目中明明有stdafx.h和stdafx.cpp,在.cpp文件最开头(第一行)也添加了这个头文件,我们也能打开这个头文件(说明stdafx.h路径正确),只不过在添加的时候这个头文件的路径我们使用的是相对路径,例如#include “…\stdafx.h”。

解决方法1:
要么你鼠标右击这个.cpp文件,属性 --> 所有配置 --> C/C++ --> 预编译头 --> 选择 : 不使用预编译头,就可以编译通过。
解决方法2:
修改#include "…\stdafx.h"为#include “stdafx.h”,即如下图所示:

头文件stdafx.h的作用(常见错误),以及如何在空项目中添加该头文件
虽然IDE智能提示有问题,但是编译却能通过,不影响使用(但是你无法鼠标右击上图这个stdafx.h来打开这个文档,毕竟路径不对,说明该.cpp文件并不需要这个stdafx.h头文件,我们完全可以设置该.cpp不使用预编译头)。


在空项目中添加stdafx.h

我们在建立win32工程的时候,当建立的是空项目的时候就没有这个头文件,而如果直接按着建立工程的步骤就会自动生成这个头文件stdafx.h。
那么当我们的工程是从空项目建立的,编译的时候如果报错:warning C4627: “#include “ServerDlg.h””: 在查找预编译头使用时跳过,甚至更严重的错误:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h””,这时候我们想添加这个"stdafx.h"的时候该怎么办呢?

解决办法:
如果由于种种原因, cpp文件在编译时找不到他所在目录中的stdafx.h, 那么
1、使用记事本 ,新建一个空白文件,放在引用stdafx.h 的cpp所在文件夹。
2、把这个新建的txt文件改名成stdafx.h ,内容可以为空。
3、在 .cpp 文件上右键 --> 属性 --> 所有配置 --> C/C++ --> 预编译头 --> 选择 : 使用预编译头(/Yu)
4、重新编译代码。


预编译头的使用方法

  1. 创建预编译头文件 stdafx.h, 在这个头文件中包含希望包含的头文件,注意不要包含自己的头文件,只包含系统头文件,不会发生变动。
  2. 创建 stdafx.cpp ,在这个文件中包含 stdafx.h
  3. 我们要让编译器知道, stdafx.cpp 文件是用来创建 .pch 文件的。在 stdafx.cpp 文件上面右键 --> 属性 --> 所有配置 --> C/C++ --> 预编译头 --> 选择 : 创建预编译头(/Yc)
  4. 我们要让编译器知道,哪些 .cpp 文件需要使用 .pch 文件。在需要使用 .pch 文件的 .cpp 中添加 #include “stdafx.h”, 然后在 .cpp 文件上右键 --> 属性 --> 所有配置 --> C/C++ --> 预编译头 --> 选择 : 使用预编译头(/Yu)
  5. 单独编译 stdafx.cpp 就会产生 .pch 文件了,如果以后不小心删除了 .pch 文件,可以单独编译一下 stdafx.cpp 文件。

注意:
6. 并不是所有的 .cpp 文件都要包含 stdafx.h ,是否使用预编译头是可以在配置项中修改的。
7. 如果一个 .cpp 文件使用了预编译头文件,那么要在 .cpp 文件的最开头去包含 stdafx.h 文件,否则会跳过 #include “stdafx.h” 之前的 #include 代码。文章来源地址https://www.toymoban.com/news/detail-483956.html


到了这里,关于头文件stdafx.h的作用(常见错误),以及如何在空项目中添加该头文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker运维中常见错误以及解决方法汇总1

    1.报错如下: Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是:PackageKit 原因:另一个APP正在锁定yum,等待其退出! 解决:执行指令 rm -f /var/run/yum.pid 2.CentOS7 设置静态的IP且可以上网

    2024年02月10日
    浏览(37)
  • Android开发-Activity中“android:exported“属性的作用,以及“Permission Denial: starting Intent“错误解决

    如何在一个应用程序中,启动另外一个应用程序?最近正有这样的需求,也踩了一个小坑。本节介绍使用Activity中\\\"android:exported\\\"属性来实现这种访问。 Activity中\\\"android:exported\\\"属性说明: 在程序清单AndroidMenifest.xml文件中,可以设置这个属性。 Android中的Activity中\\\"android:exported\\\"属

    2024年02月06日
    浏览(40)
  • vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

    一、v-model是什么 v-model是Vue框架的一种内置的API指令,本质是一种语法糖写法,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。在Vue中,v-model是用于在表单元素和组件之间创建双向数据绑定的指令。它可以简化表单元素的绑定,使得在用户输入

    2024年01月19日
    浏览(40)
  • SSH中known_hosts文件作用和常见问题及解决方法

    known_hosts文件是SSH客户端中的一个重要配置文件。当首次与一个SSH服务器建立连接时,客户端会记录下该服务器返回的的公钥,并保存在known_hosts文件中,以后每次连接该服务器时,客户端都会验证该服务器返回的公钥是否与known_hosts文件中保存的一致。如果不一致,则会发出

    2024年02月07日
    浏览(49)
  • 【环境配置】Android-Studio-OpenCV-JNI以及常见错误 ( 持续更新 )

    最近一个项目要编译深度学习的库,需要用到 opencv 和 JNI,本文档用于记录环境配置中遇到的常见错误以及解决方案 解决办法: 删除文件 .idea/gradle.xml 和 .idea/workspace.xml , 重新编译; 解决办法:Invalid Gradle JDK configuration found 原因是NDK版本过高,跟当前的AndroidStudio版本不匹配

    2024年02月11日
    浏览(29)
  • 搭建Vue项目以及项目的常见知识

    前言 :使用脚手架搭建vue项目,使用脚手架可以开发者能够开箱即用快速地进行应用开发而开发。 如图: 访问localhost:8080 vue目录层级 理解vue项目的目录层级以及文件的作用十分很重要 1、Vue的生命周期 vue生命周期图以及详情可以查看官方文档:Vue生命周期 Vue实例具有生命

    2024年02月10日
    浏览(35)
  • 【已解决】Spring常见错误:类文件具有错误的版本 61.0, 应为 52.0

    报错提示: E:IDEA_Javaworkspacespring-studyspring-02-hellospringsrctestjavaMyTest.java:2:43 java: 无法访问org.springframework.context.support.ClassPathXmlApplicationContext   错误的类文件: /F:/MyDownloads/Environment/apache-maven-3.6.3/maven-repo/org/springframework/spring-context/6.0.4/spring-context-6.0.4.jar!/org/springframework/con

    2024年02月04日
    浏览(35)
  • .gitignore作用和使用以及文件无法变黄或忽略文件无效还是被提交问题

    目录   .gitignore作用  .gitignore使用 1.语法规范(熟悉正则很容易理解) 2.示例 文件无法变黄或忽略文件无效还是被提交问题 解决方案 .gitignore 文件在 Git 版本控制系统中扮演着非常重要的角色。在任何 Git 仓库中, .gitignore 文件都可以用来告诉 Git 忽略一些文件或文件夹,怎

    2024年02月01日
    浏览(45)
  • 图像/短视频文件的MD5码的定义、作用以及获取方式

    目录 一、图像/短视频文件的MD5码定义: 二、MD5码的作用: 三、如何获取一个图像/短视频文件的MD5码:         MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于计算文件的哈希值。哈希值是一个固定长度的字节序列,可以用于验证文件的完整性和唯一性。    

    2024年02月15日
    浏览(35)
  • gitlab打tag的作用,以及如何基于tag切分支

    在 GitLab 中,Tag 是将 Git 项目中特定的提交标记为版本的一种方式。Tag 能够用于标记发布的版本,以便于对代码的每个版本进行管理和追踪。 打 Tag 的作用主要有以下几点: 标记版本发布:通过给某个提交打上 tag,可以表示当前的提交对应一个版本的发布。 方便版本回滚:

    2024年02月03日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包