C1010错误本质是编译器在读到#include "stdafx.h"(或"pch.h")前就遇到文件结尾,常见于空文件、仅含注释、该包含语句不在首行非空非注释位置、或文件含BOM;解决方式包括确保其为首行有效代码、关闭预编译头(属性→C/C++→预编译头→“不使用”)、或转存为无BOM编码。

为什么加了 #include "stdafx.h" 还报 C1010?
这个错误本质不是“没加预编译头”,而是编译器在解析源文件时,**在读到 #include "stdafx.h" 之前就遇到了文件结尾(EOF)**。常见于:空文件、只有注释、或 #include "stdafx.h" 不在第一行非空非注释位置。
Visual Studio 默认启用预编译头(PCH),要求每个 .cpp 文件的**最顶部有效代码必须是 #include "stdafx.h"(或 #include "pch.h",取决于项目设置)**,且前面不能有宏定义、条件编译、空行以外的任何内容。
- 检查文件是否为空,或只写了
// 注释就保存了 - 确认
#include "stdafx.h"是第一个非空、非注释行;前面不能有#define、#pragma once等 - 如果用了 C++17 或更新标准,且项目模板生成的是
pch.h,那要包含的是#include "pch.h",不是stdafx.h
怎么关掉预编译头避免 C1010?
如果你不需要 PCH(比如小项目、快速验证、或跨平台代码),关掉它比修包含顺序更直接。但注意:关掉后编译速度可能变慢,尤其大项目。
操作路径:右键项目 → 属性 → C/C++ → 预编译头 → 将“预编译头”选项改为“不使用预编译头”。对每个出错的 .cpp 文件都要设,或在“配置属性”里选“所有配置”批量改。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- VS2019+ 新建项目默认用
pch.h,对应设置项里显示为“创建/使用 PCH”,值应设为“不使用” - 改完必须重新生成,仅重新编译可能仍缓存旧 PCH 设置
- 如果其他文件依赖
stdafx.h里的声明,关掉后要手动补全#include
包含语句写对了还报错?检查文件编码和 BOM
某些编辑器(如记事本、带 BOM 的 UTF-8)会在文件开头插入不可见的字节序标记(BOM),导致编译器把 BOM 当作“第一个字符”,于是 #include "stdafx.h" 实际排第二,触发 C1010。
用 VS 自带编辑器打开该 .cpp 文件,查看底部状态栏编码显示。如果是 UTF-8 with BOM,点击编码 → “另存为” → 选择“UTF-8”(无 BOM)或“ANSI”保存。
- VS Code 用户:右下角点编码名 → “Save with Encoding” → 选
UTF-8(不含 BOM) - Sublime Text 默认保存为无 BOM UTF-8,一般安全;但粘贴外来代码时可能带入 BOM
- Linux/macOS 下用
file -i xxx.cpp可检测是否含 BOM
用 CMake 时怎么绕过 C1010?
CMake 默认不配 PCH,但如果你用 Visual Studio 生成器且项目里手动启用了 PCH(比如调了 target_precompile_headers),而源文件没按规则写,就会在 VS 编译阶段崩出 C1010。
解决方式分两种:
- 统一禁用:在
CMakeLists.txt中对目标移除 PCH,例如target_precompile_headers(my_target PRIVATE OFF) - 保持 PCH:确保所有参与编译的
.cpp文件第一行都是#include "pch.h"(注意名字与target_precompile_headers指定的一致),且无 BOM - 若混用 MinGW 或 Clang,C1010 不会出现——这是 MSVC 特有错误,说明你当前实际走的是 MSVC 工具链
预编译头机制本身不难,但它的强制性位置规则和隐式编码依赖,让 C1010 成为最常被误判为“头文件问题”的编译错误。真正卡住人的,往往不是逻辑,而是那一行看不见的 BOM 或那个空着保存的 .cpp 文件。

















