编译器错误 C2857

在源文件中没有找到用 /Ycfilename 命令行选项指定的“#include”语句

/Yc 选项指定未包含在正在编译的源文件中的包含文件的名称。

备注

在源文件上使用 /Yc文件名选项创建预编译标头 (PCH) 文件时,源文件必须包含文件名头文件。 源文件包含的每个文件(最多包括指定文件名)都包含在 PCH 文件中。 在其他使用 /Yu文件名选项编译的源文件中,使用 PCH 文件时,文件名包含必须是文件中的第一个非注释行。 编译器在包含之前忽略源文件中的任何内容。

此错误可能是由未在 PCH 源文件中编译的条件编译块中的 #include "filename" 语句引起的。

示例

在典型用法中,项目中的一个源文件被指定为 PCH 源文件,一个头文件用作 PCH 头文件。 典型的 PCH 头文件包含项目中使用的所有库标头,但不具有仍在开发的本地标头。 在此示例中,PCH 标头文件名为 my_pch.h

// my_pch.h
#pragma once
#include <stdio.h>

PCH 源文件是使用 /Ycmy_pch.h 选项编译的。 如果编译器找不到此 PCH 头文件包含的内容,则会生成 C2857:

// my_pch.cpp
// Compile by using: cl /EHsc /W4 /Yumy_pch.h /c my_pch.cpp

#if 0
#include "my_pch.h"  // C2857; remove conditional directives to fix
#endif

若要使用此 PCH 文件,必须使用 /Yumy_pch.h 选项编译源文件。 PCH 头文件必须首先包含在使用 PCH 的源文件中:

// C2857.cpp
// Compile my_pch.cpp first, then
// compile by using: cl /EHsc /W4 /Yumy_pch.h my_project.cpp my_pch.obj
// Include the pch header before any other non-comment line
#include "my_pch.h"

int main()
{
    puts("Using a precompiled header file.\n");
}