【MFC】プリコンパイル済みヘッダー(PCH)エラー C1010 / C1853 の正体

MFC プロジェクトに外部の .cpp.c を追加した瞬間、突然 C1010C1853 が出ることがあります。

fatal error C1010: プリコンパイル ヘッダーを検索中に予期しない EOF を検出しました。include pch.h をソースに追加しましたか?
fatal error C1853: 'Debug\\MyApp.pch' は以前のコンパイラ バージョンのプリコンパイル済みヘッダー ファイルか、C++ のプリコンパイル済みヘッダーが C から使用されています。

結論から言うと、この 2 つはどちらも PCH(プリコンパイル済みヘッダー)の使い方が、ファイルごとの実態と噛み合っていない ときに起きます。stdafx.h 時代のプロジェクトでも、近年の pch.h プロジェクトでも本質は同じです。

症状原因最短の対処
C1010そのファイルだけ /Yu なのに pch.h / stdafx.h を先頭で読んでいない自前コードならヘッダーを先頭に追加。外部コードならそのファイルだけ PCH を使用しない
C1853古い .pch が残っている、または .c / /TC が C++ 用 PCH を使おうとしているまず クリーン → リビルド.c が原因ならそのファイルだけ PCH を使用しない

この記事では、Visual Studio 2026 での確認結果をもとに、何を見れば原因が切り分けられるか最小の修正でどう直すか を順番に整理します。


目次

まず理解したい: PCH は「全ファイル共通ルール」ではない

PCH(Precompiled Header)は、巨大なヘッダー群を毎回パースし直さないための高速化機構です。MFC では afxwin.h などの重量級ヘッダーを毎回読むとビルドが重くなるため、通常は以下の形になっています。

  1. pch.cpp または stdafx.cpppch.h / stdafx.h から .pch を作る(/Yc)。
  2. 他の .cpp はその .pch を使う(/Yu)。
  3. ただし、外部から持ち込んだ純粋な .cpp.c は、このルールと噛み合わないことがある。
Visual Studio のプロジェクト設定で pch.cpp が「作成(/Yc)」、通常の cpp が「使用(/Yu)」になっている状態

ここで重要なのは、「プロジェクト全体では PCH を使うが、特定ファイルだけ例外にできる」 という点です。C1010/C1853 は、この例外設定を入れるべきファイルに、全体ルールをそのまま押し付けたときに起きやすいエラーです。


C1010 の正体: /Yu のままなのに pch.h を読んでいない

C1010 は、そのファイルが PCH を使う設定なのに、先頭で対応ヘッダーを読んでいない ときに出ます。典型例は、外部からコピーした sha256.cppjson_reader.cpp を MFC プロジェクトに追加したケースです。

// third_party_cpp.cpp
int ThirdPartyCpp()
{
    return 7;
}

このファイルは単体では何も悪くありません。しかしプロジェクト側が /Yu"pch.h" なら、コンパイラは「最初に #include "pch.h" が来るはずだ」と期待します。そこで EOF まで探して見つからないと C1010 になります。

対処 1: 自分で管理する cpp なら先頭に pch.h を入れる

そのファイルがプロジェクト内の通常コードで、MFC 側のヘッダーも参照して問題ないなら、単純に先頭へ追加すれば直ります。

#include "pch.h"

int MyFeature()
{
    return 42;
}

旧プロジェクトでは pch.h ではなく stdafx.h です。名前が違うだけで判断基準は同じです。

対処 2: 外部ライブラリの cpp なら、そのファイルだけ PCH を切る

こちらが本命です。サードパーティーのソースに pch.h を書き足すと、アップデート時に差分管理が崩れます。外部コードは汚さず、そのファイルだけ「プリコンパイル済みヘッダーを使用しない」 にするのが安全です。

  1. ソリューション エクスプローラーで対象の .cpp を右クリックし、プロパティ を開く
  2. C/C++プリコンパイル済みヘッダー を選ぶ
  3. プリコンパイル済みヘッダー使用しない に変更する
third_party_cpp.cpp のプロパティで「プリコンパイル済みヘッダーを使用しない」に変更している画面

.vcxproj では次の設定に相当します。

<ClCompile Include="third_party_cpp.cpp">
  <PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>

この方法なら、プロジェクト全体のビルド速度は維持したまま、例外ファイルだけ素通しでコンパイルできます。


C1853 の正体 1: 古い .pch が残っている

C1853 は「C から C++ の PCH を使った」場合だけでなく、今ある .pch が現在のコンパイラや設定と噛み合っていない ときにも出ます。Visual Studio の更新直後や、ツールセット変更後、ブランチ切り替え後に起きやすいパターンです。

  1. まず ビルドクリーン を実行する
  2. 続けて リビルド を実行する
  3. それでも直らない場合は、エラーメッセージに出ているファイルが .c か、ファイル単位で /TC になっていないか確認する

この 3 手で直るなら、原因は「古い中間生成物」です。ここで深追いしてコードを触る必要はありません。


C1853 の正体 2: .c ファイルが C++ 用 PCH を使おうとしている

クリーン後も C1853 が残り、問題のファイルが .c ならこちらです。MFC プロジェクトの PCH は通常 C++ として作られているため、C ソースからそのまま使うことはできません。

// legacy_c_module_broken.c
#include "pch.h"

int LegacyCModuleBroken(void)
{
    return 0;
}

この状態で .c をビルドすると、「C++ のプリコンパイル済みヘッダーが C から使用されています」という C1853 になります。

推奨対処: .c は .c のままにして、そのファイルだけ PCH を切る

外部 C ライブラリを取り込んだだけなら、無理に C++ 化しない方が安全です。.c 側から pch.h / stdafx.h を外し、さらに そのファイルだけ「プリコンパイル済みヘッダーを使用しない」 にします。

legacy_c_module_fixed.c のプロパティで「プリコンパイル済みヘッダーを使用しない」または「C コードとしてコンパイル」を確認している画面

修正後のイメージはこうです。

// legacy_c_module_fixed.c
int LegacyCModuleFixed(void)
{
    return 0;
}

どうしてもそのファイルを C++ として扱いたいなら、ファイルのプロパティで コンパイル言語の選択C++ コードとしてコンパイル (/TP) に変える方法もあります。ただし、C ライブラリの文法差分で別エラーが増えやすいので、最初の選択肢にはしない方が無難です。


迷ったときの判定フロー

  • C1010 が出たら、そのファイルの先頭に pch.h / stdafx.h があるかを見る
  • 外部コードなら、まず「そのファイルだけ PCH を使用しない」を試す
  • C1853 が出たら、最初に クリーン → リビルド で古い .pch を疑う
  • まだ直らず問題のファイルが .c なら、pch.h を読ませず、そのファイルだけ PCH を切る
  • /TP での C++ 強制は最終手段にする

「全部で使う」ではなく「例外ファイルだけ外す」 という考え方を持つと、MFC プロジェクトでも外部コードを無理なく共存させられます。C1010 と C1853 が出たら、PCH の前提とファイルごとの設定が一致しているかを確認してください。

目次