zoukankan      html  css  js  c++  java
  • fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h

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

    错误分析:
        此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。没有找到预编译指示信息的头文件"stdafx.h"。
        (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)
        我的这个问题发生于我通过添加文件的方式,向MFC内添加现有的一大坨.h和.cpp文件。这些.h和.cpp文件是属于标准C++的开源源代码范畴,与MFC无更深层次的关系。
     
    解决方式:
    一.
    1) 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”
    2) 在左侧配置属性中,点开“C/C++”,单击“预编译头”
    3) 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”
    4) 注:每一个报错的.cpp都要如此更改哦~辛苦一下呗~
    二.
    (不推荐)
    1)在解决方案右击工程,点击属性
    2)在配置属性 -> c/c++ -> 预编译头 中 将 “使用预编译头(/YU)” 改为 “不适用预编译头”
    这种做法会使每次编译过程非常缓慢
     
    备注:
    1) 貌似也可以直接在.cpp头文件上include stdafx.h。但没尝试如此修改,因为不想破坏源代码的标准性^_^
    2) 感慨一下VC在识别、编译这方面的迟滞-_-,或许是因为太强大了吧,就没考虑周全,竟然还需要手动修改~
    3) 有点怀念Qt了……
     
     
    补充的资料:
     

    一、概念:

    1、预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个“预编译头文件”的时候,则自动从这个编译结果提取需要的信息进行编译。

    2、预编译结果文件(Precompiled header file):就是那个用来保存已经编译了的符号信息的文件(.PCH作为后缀)

    3、生成预编译结果文件(Create Precompiled header file):我们说源文件A通过文件B“生成预编译结果文件”是指编译A的时候将其中编译B的编译结果保存成预编译结果文件。一般使用向导的话,A文件就是“stdafx.cpp”,B文件是“stdafx.h”。stdafx.cpp中就一行语句:

    #include “stdafx.h”

    4、使用预编译头(Using precompiled header):我们说某个源文件(a.cpp)通过“stdafx.h”来使用预编译结果是指编译a.cpp的时候,如果a.cpp第一行include语句是#include “stdafx.h”的话,那么直接取预编译结果文件的结果,不再重新编译”stdafx.h”

    二、向导是怎么做的?

    1、设置“stdafx.cpp”的预编译选项是通过“stdafx.h”文件来“生成预编译结果文件”。

    2、其他源文件的预编译选项设置是通过“stdafx.h”来“使用预编译头”

    三、使用原则?

    1、将相对稳定的头文件(比如CRT,STL,第三方固定的库)全部写在stdafx.h中。(是否使用stdafx.h依赖个人喜好,不过使用stdafx.h可以和向导保持一致)

    2、全部源文件第一行都加#include “stdafx.h”。

    3、一些不能修改的源文件(如果公共的代码,不具备权限修改的代码),设置他的预编译选项是“不使用预编译头”。注意,一定不能是选择“自动生成预编译头”,因为这样会将stdafx.h的结果冲掉(这个不知道是BUG还是设计的问题了,.^_^。)。

    四、Q&A

    Q、为什么不全部使用“自动生成预编译头文件”?

    A、“自动生成预编译头文件”和什么都不用没有什么两样,编译速度没有质的提高。

    Q、手工添加一个新的源文件到项目的时候,经常出现类似错误:

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

    A、因为向导缺省的设置是“使用预编译头”,但是你新加的文件并没有在第一行包含“stdafx.h”。解决的方法要么修改成“不使用预编译头”,要么添加一行#include “stdafx.h”

    Q、加stdafx.h和stdafx.cpp总觉得是和编译平台绑定了,不具备移植性?

    A、其实,注意一下stdafx.h的写法就没有问题了。我的解决方案是(stdafx.h的内容):

    –begin of file stdafx.h

    #ifdef _WIN32

    #include “win.h”    // 泛指window下的公共头文件

    #else

    #include “linux.h”    // 泛指linux下的公共头文件

    #endif

    #include “crt.h”      //泛指c标准库

    #include “stl.h”      //泛指STL库

    –end of file

    或者更加简单一点,如果不是VC编译器,那么stdafx.h就什么内容都不写!

  • 相关阅读:
    15. DML, DDL, LOGON 触发器
    5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
    4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
    14. 类似正则表达式的字符处理问题
    01. SELECT显示和PRINT打印超长的字符
    3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
    2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
    1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
    0. 跟踪标记 (Trace Flag) 简介
    SpringBoot + Redis + Shiro 实现权限管理(转)
  • 原文地址:https://www.cnblogs.com/zCoderJoy/p/3427630.html
Copyright © 2011-2022 走看看