Не удается открыть предварительно скомпилированный заголовочный файл

Обновлено: 30.06.2024

Часто большие проекты имеют много файлов заголовков, которые включены в каждый исходный файл. Время, затрачиваемое компилятором на обработку этих заголовочных файлов снова и снова, может составлять почти все время, необходимое для сборки проекта. Чтобы ускорить сборку, GCC позволяет вам прекомпилировать файл заголовка.

Чтобы создать предварительно скомпилированный заголовочный файл, просто скомпилируйте его, как и любой другой файл, при необходимости используя параметр -x, чтобы драйвер воспринимал его как заголовочный файл C или C++. Вы можете использовать такой инструмент, как make, чтобы обновлять предварительно скомпилированный заголовок при изменении содержащихся в нем заголовков.

Это также работает с параметром -include. Таким образом, еще один способ использования предварительно скомпилированных заголовков, подходящий для проектов, не разработанных с учетом предварительно скомпилированных файлов заголовков, заключается в том, чтобы просто взять большинство файлов заголовков, используемых проектом, включить их из другого файла заголовка, предварительно скомпилировать этот файл заголовка и -include предварительно скомпилированный заголовок. Если файлы заголовков имеют защиту от многократного включения, они пропускаются, поскольку уже были включены (в предварительно скомпилированный заголовок).

Если вам нужно предварительно скомпилировать один и тот же файл заголовка для разных языков, целей или параметров компилятора, вы можете вместо этого создать каталог с именем all.h.gch и поместить каждый предварительно скомпилированный заголовок в каталог, возможно, используя -o . Неважно, как вы называете файлы в каталоге; учитывается каждый предварительно скомпилированный заголовок в каталоге. Используется первый предварительно скомпилированный заголовок, найденный в каталоге, допустимом для этой компиляции; они просматриваются в произвольном порядке.

Есть много других возможностей, ограниченных только вашим воображением, здравым смыслом и ограничениями вашей системы сборки.

Предварительно скомпилированный заголовочный файл можно использовать только при выполнении следующих условий:

  • В конкретной компиляции можно использовать только один предварительно скомпилированный заголовок.
  • Предварительно скомпилированный заголовок нельзя использовать после того, как будет виден первый токен C. У вас могут быть директивы препроцессора перед предварительно скомпилированным заголовком; вы не можете включить предварительно скомпилированный заголовок из другого заголовка.
  • Предварительно скомпилированный заголовочный файл должен быть создан для того же языка, что и текущая компиляция. Вы не можете использовать предварительно скомпилированный заголовок C для компиляции C++.
  • Предварительно скомпилированный заголовочный файл должен быть создан тем же двоичным файлом компилятора, что и текущая компиляция.
  • Все макросы, определенные до включения предварительно скомпилированного заголовка, должны быть определены так же, как при создании предварительно скомпилированного заголовка, или не должны влиять на предварительно скомпилированный заголовок, что обычно означает, что они не появляются в предварительно скомпилированном заголовке в все.

Для всех этих вариантов, кроме последнего, компилятор автоматически игнорирует предварительно скомпилированный заголовок, если условия не выполняются. Если вы обнаружите, что комбинация параметров не работает и не приводит к игнорированию предварительно скомпилированного заголовка, рассмотрите возможность подачи отчета об ошибке, см. Ошибки.

Если вы используете разные параметры при создании и использовании предварительно скомпилированного заголовка, фактическое поведение представляет собой смесь поведения для параметров. Например, если вы используете -g для создания предварительно скомпилированного заголовка, но не при его использовании, вы можете получить или не получить отладочную информацию для подпрограмм в предварительно скомпилированном заголовке.

Когда я создаю свое решение на C++ в Visual Studio, оно жалуется, что отсутствует файл xxxxx.pch. Есть ли параметр, который мне не хватает, чтобы вернуть предварительно скомпилированные заголовки?

вот точная ошибка для полноты картины:

вы должны предоставить больше информации. какую именно ошибку вы получаете? как сейчас настроен ваш проект?

13 ответов 13

ПРИМЕЧАНИЕ. Более поздние версии IDE могут использовать "pch" вместо "stdafx" в именах по умолчанию для связанных файлов. В приведенных ниже инструкциях может потребоваться заменить stdafx на pch. Я извиняюсь. Это не моя вина.

  1. Щелкните правой кнопкой мыши свой проект в обозревателе решений.
  2. Нажмите "Свойства" в нижней части раскрывающегося меню.
  3. В левом верхнем углу страницы свойств выберите "Все конфигурации" в раскрывающемся меню.
  4. Откройте дерево C/C++ и выберите Предварительно скомпилированные заголовки.
  5. Предварительно скомпилированный заголовок: выберите «Использовать» (/Yu)
  6. Заполните поле Предварительно скомпилированный файл заголовка. Стандарт — stdafx.h

Повезло 13. Скрестите пальцы и нажмите "Создать".

Это более простой ответ, чем мой. Шаги 1-7 необходимы для работы PCH, но сообщение об ошибке из вопроса указывает на то, что эти шаги уже были выполнены. OTOH, он предполагает наличие одного файла stdafx.pch, а xxxxx.pch из вопроса намекает на более сложную проблему (настройка нескольких PCH).

Использование предварительно скомпилированного заголовка (pch) представляет собой двухэтапный процесс.

На первом этапе вы компилируете файл-заглушку (в VS200x он обычно называется stdafx.cpp . В более новых версиях используется pch.cpp .). Этот файл-заглушка косвенно включает только те заголовки, которые вы хотите предварительно скомпилировать.Как правило, в одном небольшом заголовке (обычно stdafx.h или pch.hpp) перечислены стандартные заголовки, такие как и , которые затем включаются в файл-заглушку. При компиляции создается файл .pch.

На шаге 2 исходный код включает тот же небольшой заголовок из шага 1, что и первый заголовок. Компилятор, когда он встречает этот специальный заголовок, вместо этого читает соответствующий файл .pch. Это означает, что ему не нужно (повторно) компилировать эти стандартные заголовки каждый раз.

В вашем случае кажется, что шаг 1 не выполняется. Файл-заглушка все еще присутствует? В вашем случае это, вероятно, будет xxxxx.cpp . Это должен быть файл, скомпилированный с параметром /Yc:xxxxx.pch, так как это флаг компилятора, указывающий, что это шаг 1 процесса PCH. Если xxxxx.cpp присутствует и является таким файлом-заглушкой, то, вероятно, отсутствует параметр компилятора /Yc:.


Младший участник

Не удается открыть предварительно скомпилированный заголовочный файл: «Debug\test4.pch»: нет такого файла или направления

//---------------------------------------------------------------------------- --------------------
но он всегда сообщает мне информацию об ошибке
фатальная ошибка C1083: невозможно открыть предварительно скомпилированный заголовочный файл: 'Debug\test4 .pch': Нет такого файла или каталога

вот почему? кто это знает.


Участник +


Участник +

щелкнуть правой кнопкой мыши имя файла в проводнике (в разделе исходных файлов)
выбрать свойства
выбрать предварительно скомпилированные заголовки
выбрать «не использовать предварительно скомпилированные заголовки»


Старший член

Перейдите в папку проекта и удалите папку отладки. Это стирает ваш старый файл предварительно скомпилированного заголовка. Если вы внесли изменения в какие-либо предварительно скомпилированные заголовки, а затем скомпилировали их, будет выдана эта ошибка, если вы «Используете предварительно скомпилированные заголовки».

-- M r Doom Master
-- C++ Гейм-программист oграмматика

Не забудьте оценить меня, если я был вам полезен!

Плакат об элитном членстве

Я всегда отключаю предварительно скомпилированные заголовки при использовании Visual C++. Мне нужен переносимый код, и в любом случае он достаточно быстро компилируется для меня.


Младший участник

Участник +

Первоначальное сообщение от erikax

Плакат об элитном членстве

Первоначальное сообщение от erikax

Как это решит проблему?

Во всяком случае, такого заголовочного файла, как "iostream.h", в Visual C++ 2003 и выше нет.

Плакат об элитном членстве

Первоначальное сообщение от mloonjin

Неверный форум. Это не С++. Это какой-то другой язык под названием «Управляемый C++», который отличается от C++.

Неустранимая ошибка C1083. Не удается открыть предварительно скомпилированный файл заголовка. Однако при компиляции вылетает следующая ошибка. Я не включил этот заголовок в свой код; Данный файл или каталог отсутствует. Не удается открыть предварительно скомпилированный заголовочный файл: что означает эта ошибка.

Но возникает следующая ошибка:

Невозможно открыть предварительно скомпилированный заголовочный файл: Не удается открыть включаемый файл, но этот файл уже включен во время поиска с этой ошибкой. Нет такого файла или каталога | 4fun4you. Вы увидите, что для этого флага установлено значение true, измените его на false. Данный файл или каталог отсутствует. Я не понимаю, как может отсутствовать файл заголовка, если он был там, когда я выбираю новый проект, затем нажимаю clr под Visual C++, а затем консоль clr.

0 7 Компиляция вашей первой программы Learn C

Компиляция и интеграция Crypto в проект Codeproject среды Microsoft Visual C

Как исправить неожиданную ошибку конца файла при переполнении стека Pch H. На что указывает эта ошибка. Данный файл или каталог отсутствует. Не удается открыть предварительно скомпилированный заголовочный файл: однако при компиляции возникает следующая ошибка. Я не включил этот заголовок в свой код;

Ошибка C1083 Не удается открыть включаемый файл Iexbaseexc H Нет такого файла или переполнение стека каталога

Ошибка 1 Неустранимая ошибка C1083 Невозможно открыть предварительно скомпилированный файл заголовка Debug Xxx Pch

Устранение неполадок Pkg Неустранимая ошибка компилятора сборки пакета C1083 Не удается открыть включаемый файл или не удается открыть предварительно скомпилированный файл заголовка Jde Pch Нет такого файла или каталога Идентификатор документа 1310259 1 Microsoft. На что указывает эта ошибка.Однако при компиляции вылетает следующая ошибка. Не удается открыть предварительно скомпилированный заголовочный файл: нет такого файла или каталога. Я не включил этот заголовок в свой код;

0 7 Компиляция вашей первой программы Learn C

Stdafx H для новичков

Неустранимая ошибка C1010: при поиске предварительно скомпилированного заголовка обнаружен непредвиденный конец файла. Вы забыли добавить Include Stdafx H в исходный код, который искал программист. На что указывает эта ошибка. Я не включил этот заголовок в свой код; Данный файл или каталог отсутствует. Не удается открыть предварительно скомпилированный заголовочный файл: однако при компиляции возникает следующая ошибка.

Ошибка, которую я получаю, когда пытаюсь создать новый проект C Visual C Windows Tech

Проблемы с предварительно скомпилированным заголовком Pch И рекомендации Блог команды C

Миграция на Msvc 2010 или более позднюю версию с более ранних версий. Я не включил этот заголовок в свой код; Однако при компиляции вылетает следующая ошибка. Данный файл или каталог отсутствует. На что указывает эта ошибка. Не удается открыть предварительно скомпилированный заголовочный файл:

Как исправить неожиданную ошибку конца файла при переполнении стека Pch H

Visual C Odbc Query C And C Codecall

Метод ошибки предварительно скомпилированного заголовка C1853 в версии Vs2015, которую искал программист. Я не включил этот заголовок в свой код; Данный файл или каталог отсутствует. На что указывает эта ошибка. Однако при компиляции вылетает следующая ошибка. Не удается открыть предварительно скомпилированный заголовочный файл:

Блог команды C

Начните выполнение кода C с помощью Visual Studio Daniweb

Stdafx H. Я не включил этот заголовок в свой код; Однако при компиляции вылетает следующая ошибка. На что указывает эта ошибка. Данный файл или каталог отсутствует. Не удается открыть предварительно скомпилированный заголовочный файл:

Pkg Troubleshooting Package Build Compiler Неустранимая ошибка C1083 Не удается открыть включаемый файл или не удается открыть предварительно скомпилированный файл заголовка Jde Pch Нет такого файла или каталога Идентификатор документа 1310259 1 Компьютерный файл Microsoft Visual Studio

Stdafx H Manual Stdafx H Manual By Andrey Karpov Medium

Создание Caffe в Windows с помощью Visual Studio 2013 Cuda 6 5 Opencv 2 4 9 Блог Neil Z Shao S. Однако при компиляции вылетает следующая ошибка. Не удается открыть предварительно скомпилированный заголовочный файл: что означает эта ошибка. Я не включил этот заголовок в свой код; Нет такого файла или каталога.

Mysql C 42 Fatal Error C1083 Cannot Open Include File Config Win H Нет такого файла или директора ال٠بر٠ج العربي

Mysql C 42 Неустранимая ошибка C1083 Невозможно открыть Включить файл конфигурации Win H Нет такого файла или директора ال٠بر٠ج العربي. Не удается открыть предварительно скомпилированный заголовочный файл: что означает эта ошибка. Я не включил этот заголовок в свой код; Однако при компиляции вылетает следующая ошибка. Нет такого файла или каталога.

Вы увидите, что для этого флага установлено значение true, измените его на false.

Не открывать файл включение:

Предварительно скомпилированный заголовочный файл «project.pch» взят из предыдущей версии компилятора, или предварительно скомпилированный заголовок — это C++, и вы используете его из c, вы не можете использовать для них общий предварительно скомпилированный заголовок (файл *.pch).< /p>

Как исправить ошибку c1083, не удается открыть включаемый файл:

Откройте файл *.vcproj решения в блокноте и проверьте флаг компилятора ignorestandardincludepath.

Затем вы можете продолжить и снова установить флажок, чтобы ускорить компиляцию.

Эта статья предназначена для тех программистов, которые только начинают работать в среде Visual Studio и пытаются компилировать в ней свои проекты на C++. В незнакомой среде все может выглядеть странно и сложно, а новичков особенно раздражает файл stdafx.h, вызывающий странные ошибки при компиляции. Довольно часто все заканчивается тем, что они старательно отключают все предкомпилированные заголовки в каждом проекте. Мы написали эту статью, чтобы помочь новичкам в Visual Studio разобраться во всем этом.

скачанные файлы< бр />

Назначение предварительно скомпилированных заголовков

Предварительно скомпилированные заголовки предназначены для ускорения сборки проекта.Приступая к работе с Visual C++, программисты обычно пробуют его на очень небольших проектах, которые не могут показать прирост производительности от использования предварительно скомпилированных заголовков. И с ними, и без них программа компилируется одинаково. Это как раз то, что смущает пользователя; он не видит в этой опции никакой пользы, и делает вывод, что она нужна для каких-то конкретных задач и никогда ему не понадобится. Это заблуждение может длиться годами.

Предварительно скомпилированные заголовки на самом деле очень полезная технология. Выгоду можно увидеть даже с проектом всего из нескольких десятков файлов. Использование таких тяжелых библиотек в качестве буста сделает прирост производительности особенно заметным.

Если вы изучите файлы *.cpp в своем проекте, то заметите, что многие из них содержат одни и те же наборы заголовков, например , , . Эти заголовки, в свою очередь, включают в себя другие заголовки и т. д.

Объем работы, который должен выполнять препроцессор во время компиляции проекта, может быть значительно уменьшен. Идея состоит в том, чтобы предварительно обработать группу файлов, а затем просто вставить уже подготовленные текстовые фрагменты, где это необходимо.

На самом деле он включает в себя еще несколько шагов; вместо простого текста можно хранить более высокообработанную информацию. Мы не знаем, как именно это все реализовано в Visual C++, но я знаю, что, например, можно хранить уже разбитый на лексемы текст. Это еще больше ускорит процесс компиляции.

Как работают предварительно скомпилированные заголовки

Файл, содержащий предварительно скомпилированные заголовки, имеет расширение «.pch». Имя файла обычно совпадает с названием проекта, но вы, естественно, можете изменить это и любые другие используемые имена в настройках. Файл *.pch может быть довольно большим, что зависит от того, сколько заголовков в нем развернуто. В PVS-Studio, например, он занимает около 3 Мбайт.

Самое интересное хранится в файле stdafx.h. В него должны быть включены все заголовочные файлы, которые необходимо предварительно скомпилировать. Например, ниже показан файл stdafx.h, который мы используем в PVS-Studio (текст статьи сокращен):

Теперь файл «stdafx.h» должен быть включен во все файлы *.c/*.cpp. Вы также должны удалить из этих файлов все заголовки, уже включенные в «stdafx.h».

Но что делать, если в разных файлах используются несколько похожие, но все же разные наборы заголовков? Например:

Следует ли создавать отдельные предварительно скомпилированные заголовки? Ну, вы можете сделать это, но вам не нужно.

Вам нужно создать только один предварительно скомпилированный заголовок, в котором , и будут развернуты. Выгода от того, что препроцессору не нужно читать несколько файлов и вставлять их друг в друга, перевешивает потери на синтаксическом анализе дополнительных фрагментов кода.

Как использовать предварительно скомпилированные заголовки

При запуске нового проекта мастер Visual Studio создает два файла: stdafx.h и stdafx.cpp. Именно через них реализован механизм прекомпилируемых заголовков.

На самом деле эти файлы могут иметь любые другие имена; важно не название, а параметры компиляции, которые вы указываете в настройках проекта.

Файл *.c/*.cpp может использовать только один предварительно скомпилированный заголовок. Однако один проект может содержать несколько разных предварительно скомпилированных заголовков. Предположим, что пока у нас есть только один.

Таким образом, если вы использовали мастер, файлы stdafx.h и stdafx.cpp уже созданы для вас, а также определены все необходимые параметры компиляции.

Если вы не использовали параметр предварительно скомпилированных заголовков в своем проекте, давайте узнаем, как его включить. Предлагаю следующий алгоритм:

  1. Включить предварительно скомпилированные заголовки во всех конфигурациях для всех файлов *.cpp. Это можно сделать на вкладке «Предварительно скомпилированный заголовок»:
    1. Установите значение «Использовать (/Yu)» для параметра «Предварительно скомпилированный заголовок».
    2. Установите «stdafx.h» для параметра «Предварительно скомпилированный файл заголовка».
    3. Установите «$(IntDir)$(TargetName).pch» для параметра «Предварительно скомпилированный выходной файл заголовка».

    Теперь мы включили опцию предварительно скомпилированных заголовков. Если мы запустим компиляцию сейчас, компилятор создаст файл *.pch. Однако компиляция прервется чуть позже из-за ошибок.

    Заголовок «stdafx.h» должен быть самым первым для включения в файл *.c/*.cpp. Это обязательно! В противном случае вы гарантированно получите ошибки компиляции.

    Если подумать, это действительно имеет смысл. Когда файл «stdafx.h» включен в самом начале, вы можете подставить в файл уже предварительно обработанный текст. Этот текст всегда остается неизменным и ни на что не влияет.

    Лайфхак

    Сторонние библиотеки, включенные в проект в качестве исходных файлов, создают дополнительные проблемы. Изменение этих файлов не имеет смысла. Лучшим решением будет отключить для них предварительно скомпилированные заголовки, но это неудобно при использовании ряда небольших библиотек. Вы будете постоянно спотыкаться о предварительно скомпилированные заголовки.

    Однако есть более простой способ обработки предварительно скомпилированных заголовков.Этот метод не является универсальным, но во многих случаях он мне помогал.

    Перейдите на вкладку «Дополнительно». Выберите все конфигурации. В поле «Forced Included File» напишите следующий текст:

    Отныне «stdafx.h» будет автоматически включаться в начало ВСЕХ компилируемых файлов. ПРИБЫЛЬ!

    Что включать в stdafx.h

    Это очень важный вопрос. Бездумное включение каждого отдельного заголовка в «stdafx.h» замедлит процесс компиляции, а не ускорит его.

    Все файлы, содержащие «stdafx.h», зависят от их содержимого. Предположим, что «stdafx.h» включает в себя файл «X.h». Небольшое изменение «X.h» может привести к полной перекомпиляции всего проекта.

    Важное правило. Убедитесь, что ваш файл «stdafx.h» включает только те файлы, которые никогда или ОЧЕНЬ редко изменяются. Лучшими кандидатами являются заголовки из системных и сторонних библиотек.

    Если вы включаете собственные файлы проекта в «stdafx.h», будьте особенно осторожны. Включайте только те файлы, которые изменяются очень-очень редко.

    Если какой-либо файл *.h меняется раз в месяц, это слишком часто. В большинстве случаев для внесения всех необходимых правок в h-файл требуется не один раз — обычно 2 или 3 раза. Полностью перекомпилировать весь проект 2 или 3 раза довольно неприятно, не так ли? Кроме того, все ваши коллеги должны будут сделать то же самое.

    Но не относитесь к неизменяемым файлам слишком фанатично. Включайте только те заголовки, которые вы используете очень часто. Включать смысла не будет, если нужно всего в паре файлов. Вместо этого просто включите этот файл там, где это необходимо.

    Несколько предварительно скомпилированных заголовков

    Для чего может понадобиться несколько предварительно скомпилированных заголовков в одном проекте? Ну, это действительно довольно редкая ситуация. Но вот пара примеров.

    Представьте, что в проекте одновременно используются файлы *.c и *.cpp. Использовать для них общий файл *.pch нельзя — компилятор выдаст ошибку.

    Необходимо создать два файла *.pch. Один из них создается после компиляции C-файла (xx.c), другой — после компиляции C++-файла (yy.cpp). Соответственно, в настройках нужно указать использовать один прекомпилированный заголовок для C-файлов, а другой для C++-файлов.

    Примечание. Не забудьте задать разные имена для этих двух файлов *.pch. В противном случае они будут заменять друг друга.

    Вот другая ситуация:
    Одна часть проекта использует одну большую библиотеку, а другая часть использует другую большую библиотеку.

    Естественно, разные части проекта не должны знать об обеих библиотеках: может быть (к несчастью) совпадение имен сущностей в разных библиотеках.

    Логично создать два предварительно скомпилированных заголовка и использовать их в разных частях программы. Как мы уже упоминали, вы можете использовать любые имена для файлов, из которых создаются файлы *.pch. Ну и даже имя файла *.pch тоже можно поменять. Конечно, все это нужно делать очень аккуратно, но в использовании двух предварительно скомпилированных заголовков нет ничего особенно сложного.

    Типичные ошибки при использовании предварительно скомпилированных заголовков

    Теперь, когда вы внимательно прочитали приведенный выше текст, вы поймете и устраните все ошибки, связанные с stdafx.h. Но предлагаю еще раз быстро просмотреть типичные ошибки начинающих программистов и разобраться в их причинах. Практика делает совершенным.

    Неустранимая ошибка C1083: не удается открыть предварительно скомпилированный заголовочный файл: «Debug\project.pch»: нет такого файла или каталога

    1. Файл stdafx.cpp еще не скомпилирован, поэтому файл *.pch еще не создан. Это может произойти, например, когда вы сначала очищаете решение, а затем пытаетесь скомпилировать один файл *.cpp (Компилировать Ctrl-F7). Чтобы решить проблему, скомпилируйте все решение или хотя бы файл stdafx.cpp.
    2. В настройках не указан файл для генерации файла *.pch, то есть проблемы с ключом компиляции /Yc. Эта проблема характерна для новичков в Visual Studio, которые впервые пытаются использовать предварительно скомпилированные заголовки в своем проекте. Чтобы узнать, как это сделать правильно, см. выше раздел «Как использовать предварительно скомпилированные заголовки».

    Текст ошибки говорит сам за себя, если вы потрудитесь его прочитать. Файл компилируется с ключом /Yu. Это означает, что должен использоваться предварительно скомпилированный заголовок, но в файле отсутствует «stdafx.h».

    Если вы не можете этого сделать, не используйте предварительно скомпилированный заголовок для этого файла *.c/*.cpp. Удалите переключатель /Yu.

    Неустранимая ошибка C1853: предварительно скомпилированный заголовочный файл «project.pch» относится к предыдущей версии компилятора, или предварительно скомпилированный заголовок относится к C++, и вы используете его из C (или наоборот)

    Проект содержит файлы C (*.c) и C++ (*.cpp). Для них нельзя использовать общий предварительно скомпилированный заголовок (файл *.pch).

    1. Отключить предварительно скомпилированные заголовки для всех C-файлов. Практика показывает, что файлы *.c препроцессируются в несколько раз быстрее, чем файлы *.cpp. Если у вас всего несколько файлов *.c, вы не потеряете в производительности, отключив для них предварительно скомпилированные заголовки.
    2. Создайте два предварительно скомпилированных заголовка. Первый должен быть сгенерирован из stdafx_cpp.cpp, stdafx_cpp.h; второй из stdafx_c.c, stdafx_c.h. Соответственно, вы должны использовать разные предварительно скомпилированные заголовки для файлов *.c и *.cpp. Разумеется, имена файлов *.pch тоже должны быть разными.

    Компилятор работает некорректно при использовании предварительно скомпилированных заголовков

    Взгляните на этот пример:

    Этот код не скомпилируется, компилятор выдаст странное сообщение об ошибке:

    Правильный код должен выглядеть так:

    Еще один пример:

    Содержимое файла my.h использоваться не будет. В результате вы не сможете использовать функции, объявленные в этом файле. Такое поведение сильно смущает программистов. Они пытаются «вылечить» его, полностью отключив предварительно скомпилированные заголовки, а потом придумывают истории о том, насколько глючен Visual C++. Помните одну вещь: компилятор — это один из инструментов с наименьшим количеством ошибок. В 99,99% случаев злиться надо не на компилятор, а на ошибки в собственном коде (Proof).

    Еще один способ – использовать принудительно включенный файл. Смотрите раздел «Лайфхак» выше.

    Проект полностью перекомпилируется при использовании предварительно скомпилированных заголовков

    Вы добавили в stdafx.h файл, который регулярно редактируете. Или вы могли включить автоматически сгенерированный файл по ошибке.

    Внимательно изучите содержимое файла stdafx.h: он должен содержать только те заголовки, которые никогда не меняются или изменяются очень редко. Имейте в виду, что хотя некоторые включаемые файлы не изменяются сами по себе, они могут содержать ссылки на другие файлы *.h, которые изменяют это.

    Происходит что-то странное

    Иногда вы можете столкнуться с проблемой, когда ошибка не исчезает даже после исправления кода. Отладчик сообщает о чем-то странном.

    Эта проблема может быть связана с файлом *.pch. Компилятор почему-то не замечает, что один из заголовочных файлов был изменен, поэтому не перекомпилирует файл *.pch, а продолжает вставлять ранее сгенерированный текст. Это могло быть вызвано какими-то ошибками, связанными со временем модификации файла.

    Это ОЧЕНЬ редкая ситуация. Но это возможно, и вы должны знать об этом. Лично я сталкивался с этой проблемой всего 2 или 3 раза за многолетнюю карьеру. Ее можно решить путем полной перекомпиляции проекта.

    Кстати, вы можете скачать PVS-Studio и проверить свою программу на наличие ошибок.

    Заключение

    Как видите, работать с предварительно скомпилированными заголовками довольно просто. Программисты, которые пытаются их использовать и постоянно сталкиваются с «многочисленными ошибками компилятора», просто не понимают принципов работы этого механизма. Мы надеемся, что эта статья помогла вам преодолеть это недоразумение.

    image1

    Предварительно скомпилированные заголовки — очень полезная опция, позволяющая значительно повысить скорость компиляции проекта.

    Читайте также: