Что такое формат файла PCH?
Файл .pch - это предварительно скомпилированный заголовок, бинарный кэш компилятора, создаваемый автоматически в процессе сборки. Вместо того чтобы заново анализировать объемные заголовочные файлы, такие как Windows SDK или stdafx.h, в каждой единице трансляции, компилятор сериализует свое внутреннее состояние - таблицы символов, узлы AST, определения макросов, флаги include-guard - в снимок .pch. Последующие единицы трансляции загружают этот снимок напрямую, что значительно сокращает время сборки крупных проектов на C и C++.
MSVC создает файлы .pch с помощью флага компилятора /Yc, обычно из специального исходного файла-заглушки с именем pch.cpp или stdafx.cpp. Clang хранит свои предварительно скомпилированные заголовки в виде сжатого битстрима LLVM, встроенного в нативный объектный файл в секции с именем __clangast. Эквивалент в GCC использует расширение .gch вместо .pch.
Формат является полностью внутренним для компилятора - проприетарным, бинарным и непереносимым между машинами. Файл .pch становится недействительным при изменении версии компилятора, флагов компиляции или любого включенного заголовка; система сборки регенерирует его автоматически. Типичный размер варьируется от 10 МБ до более чем 200 МБ, если включены заголовки Windows SDK.
Пользователи никогда не создают и не открывают файлы .pch вручную. Удаление файла безопасно - следующая сборка создаст его заново, а полная пересборка является стандартным решением при возникновении стойких ошибок, связанных с PCH. Модули C++20 частично снижают зависимость от предварительно скомпилированных заголовков в новых кодовых базах, но .pch остается доминирующим механизмом ускорения компиляции в существующих проектах на C и C++.
Безопасность и защита
РИСК: LOWФайл .pch является внутренним артефактом сборки компилятора. Он не может исполнять код и не запускается операционной системой. Значимых векторов атаки нет; файл создается локально системой сборки и привязан к конкретной машине.
Детали формата
в двух словах- Apple Xcode Prefix Header - Xcode (до появления Swift) использовал префиксный заголовок .pch (исходный файл, не бинарный) для предварительной компиляции заголовков Objective-C; концепция та же, но файл является текстовым заголовком, а не бинарным выводом.
Программы, открывающие файлы PCH
Технические подробности
глубокая спецификация| Тип файла | Бинарный кэш компилятора (сериализованное состояние AST и символов) |
| Кодировка | Бинарная (внутреннее представление компилятора) |
| Порядок байтов | Little-endian (MSVC на x86/x64); зависит от целевой платформы (Clang) |
| Контейнер | Проприетарный бинарный блок (MSVC); объектный файл COFF/ELF/Mach-O со встроенной секцией __clangast (Clang) |
| Сжатие | Нет (MSVC); сжатый битстрим LLVM на базе zlib (Clang) |
| Типичный размер | 10 МБ - 200 МБ; PCH для Windows SDK обычно 50-200 МБ |
| Флаг генерации MSVC | /Yc создает PCH; /Yu использует его в последующих единицах трансляции |
| Исходный файл по умолчанию | stdafx.cpp или pch.cpp в проектах MSVC |
| Специфичность для машины | Не переносится между машинами; MSVC PCH содержит информацию об адресах, специфичную для хоста |
| Аннулирование | Автоматически регенерируется при изменении версии компилятора, флагов или любого включенного заголовка |
| Эквивалент в GCC | Расширение .gch (предварительно скомпилированные заголовки GCC не используют .pch) |
| Определение версии | MSVC встраивает внутреннюю сигнатуру; отклоняет устаревшие файлы PCH при несоответствии версии или флагов |
| Преемник в C++20 | Модули C++20 (.ifc в MSVC) частично заменяют PCH в новых кодовых базах |
| Связанные ОС | Windows (MSVC), macOS (Xcode и Clang), Linux (Clang и GCC) |
| Выпущен | 1988 (Microsoft C Compiler 6.0 for MS-DOS, first PCH implementation); mainstream adoption with MSVC for Windows in the 1990s |
| Последняя версия | N/A - format is internal per compiler; MSVC PCH is regenerated by each compiler version |
| Спецификация | learn.microsoft.com |
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах PCH.