Не удается открыть исходный файл stdafx h
Обновлено: 24.11.2024
Решение проблемы Если предварительно скомпилированный заголовок не используется, это включение не должно генерироваться в коде. Чтобы отключить его, откройте диалоговое окно «Свойства компонента Visual C++» и на вкладке «Включает» удалите текст в «Исходный исходный код включает». Другая возможность — создать пустой файл «stdafx. h».
Предварительно скомпилированный заголовок stdafx. h в основном используется в Microsoft Visual Studio, чтобы сообщить компилятору файлы, которые были однажды скомпилированы, и нет необходимости компилировать их с нуля. Например: если вы включаете указанные ниже заголовочные файлы Windows.
Что такое Stdafx h в Visual Studio?
h (названный stdafx.h до Visual Studio 2017) — это файл, созданный мастером Microsoft Visual Studio IDE, который описывает как стандартные системные, так и специфичные для проекта включаемые файлы, которые часто используются, но почти никогда не изменяются. AFX в stdafx. h обозначает расширения фреймворка приложения.
Что такое Targetver H?
h и SDKDDKVer. h используются для управления тем, какие функции, константы и т. д. включаются в ваш код из заголовков Windows в зависимости от ОС, которую вы хотите поддерживать в своей программе. Я верю, что таргетвер. h устанавливает по умолчанию использование последней версии Windows, если определения не указаны где-либо еще.
Как использовать Stdafx H?
Как использовать предварительно скомпилированные заголовки
- Включить предварительно скомпилированные заголовки во всех конфигурациях для всех файлов *. cpp-файлы.
- Создайте файл stdafx. h и добавьте его в проект.
- Создайте файл stdafx. cpp и добавьте его в проект.
- Измените настройки stdafx.
Как использовать Stdafx h в Visual Studio?
Настройте Visual Studio для создания предварительно скомпилированных заголовков, выберите «Все конфигурации», затем перейдите в C/C++ -> Предварительно скомпилированные заголовки, выберите «Создать предварительно скомпилированные заголовки», убедитесь, что stdafx. h – это заголовочный файл, а для остальных оставьте значения по умолчанию.
Нужен ли Stdafx H?
stdafx. ч не является строго необходимым. Как отмечали другие: если вам не нужны предварительно скомпилированные заголовки, вам действительно не нужен stdafx.
Что такое Ntddi_version?
В этой статье используйте макрос NTDDI_VERSION, чтобы указать версию операционной системы (ОС) содержимого в файлах заголовков и библиотеках набора драйверов Windows (WDK), которые поддерживает ваш драйвер. Например, в версии WDK для Windows 7 процесс сборки устанавливает для NTDDI_VERSION значение _NTDDI_WIN7 (0x06010000).
Что такое SDKDDKVer?
Нужен ли Stdafx H?
h не является строго обязательным. Как упоминали другие: если вам не нужны предварительно скомпилированные заголовки, вам действительно не нужен stdafx. ч . И использовать его только для группировки общих включений — довольно плохая практика, на самом деле.
Как исправить, что stdafx не может открыть включаемый файл?
Решение номер один. 1. Пересоздайте проект. При создании проекта убедитесь, что предварительно скомпилированный заголовок отмечен (Настройки приложения… *** Не проверять пустой проект)
Что такое ошибка «невозможно открыть включаемый файл»?
Я вставил форму кода, которая выдает следующую ошибку C1083: Не удается открыть включаемый файл: ‘stdafx.h’: Нет такого файла или каталога. Может ли кто-нибудь помочь мне, как решить эту проблему.
Как включить stdafx.h в проект?
Почему я получаю фатальную ошибку c1083?
Показывает — фатальная ошибка C1083: Невозможно открыть включаемый файл: ‘stdio.h’: Нет такого файла или каталога Согласно вашему описанию. Компилятор выдает ошибку c1083, когда не может найти файл. Есть несколько причин, по которым компилятор выдает эту ошибку. Вы можете посмотреть статью. Надеюсь, статья поможет вам решить проблему.
Этот форум перенесен в раздел вопросов и ответов Майкрософт. Посетите Microsoft Q&A, чтобы публиковать новые вопросы.
Вопрос:
Вопрос
ОШИБКА:
не удается открыть исходный файл "stdafx.h"
не удается открыть исходный файл "resource.h"
идентификатор "IDR_DATA1" не определен
ВЫПОЛНЕННЫЕ ШАГИ
создайте новый проект
щелкните Visual C++/Windows Desktop/Windows Desktop Wizard
отметьте
Precompiled Header
Security Dev.
нажмите меню «Проект/Добавить существующие элементы»
добавьте 45805.cpp
щелкните правой кнопкой мыши «Проект/Сборка»
затем появится сообщение об ошибке выше
Все ответы
Это может помочь вам решить вашу проблему.
Если предварительно скомпилированный заголовок не используется, это включение не должно генерироваться в коде. Чтобы отключить его, откройте диалоговое окно «Свойства компонента Visual C++» и на вкладке «Включает» удалите текст в поле «Исходные включения».
Еще одна возможность — создать пустой файл "stdafx.h". Дополнительные сведения о предварительно скомпилированных файлах заголовков см. в базе знаний Microsoft.
Исторический номер
Я беспокоюсь, что если я создам пустой stdafx.h, мой exe не запустится
кроме того, здесь у меня другая ошибка
ОШИБКА:
не удается открыть исходный файл "stdafx.h"
не удается открыть исходный файл "resource.h"
идентификатор "IDR_DATA1" не определен
Не могли бы вы протестировать на своем сайте, не удаляя предварительно никаких зависимостей?
Добро пожаловать на форум MSDN.
Кажется, ваша проблема связана с разработкой C++, и наш форум предназначен для обсуждения VS IDE, я помогу вам перенести эту тему на соответствующий форум для лучшей поддержки, спасибо за понимание.
Спасибо за публикацию здесь.
>>Меня беспокоит, что если я создам пустой stdafx.h, мой exe-файл не запустится,
помимо того, что у меня есть еще одна ошибка,
ОШИБКА:
невозможно открыть исходный файл "stdafx.h "
не удается открыть исходный файл "resource.h"
идентификатор "IDR_DATA1" не определен
Я создал образец, главная функция называется main, поэтому я думаю, что это консольное приложение.
Для IDR_DATA1 я создаю файл data1.dat с идентификатором файла IDR_DATA1.
Надеюсь, это поможет вам.
Спасибо, что ответили мне, Джек, но я не понимаю, что вы имеете в виду
Это первый раз, когда я пытаюсь скомпилировать с помощью VS 2017
Моя ЦЕЛЬ проста.
Поскольку отсутствуют stdafx.h, Windows.h, resources.h
Правильно ли я говорю, что мне нужно найти на моем диске C все эти файлы и скопировать в ресурсы проекта, а затем нажать «Создать»?
Спасибо за публикацию здесь.
>>Правильно ли я говорю, что мне нужно найти на моем диске C все эти файлы и скопировать в ресурсы проекта, а затем нажать «Создать»?
Загрузите мою демонстрацию и дважды щелкните файл testLPE.sln. он будет открыт vs2017.
В моей демонстрации есть небольшая ошибка.
Тег: фатальная ошибка C1083: Не удается открыть включаемый файл: 'afxwin.h': Нет такого файла или каталога Сборка для: Visual Studio 8 2005 Проверить работоспособность компилятора C, используя: сборка XTRADB как статическая библиотека libxtradb.lib сборка ОБРАТНАЯ СВЯЗЬ как статическая библиотека для MFC Ищем MFC найдено Не удается найти установщик проекта wix 3 не будет.
vc++ 6.0 фатальная ошибка RC1015: не удается открыть включаемый файл 'afxres.h' поселение было открыто или под чужим исходным кодом из интернета C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE Решение: в вашем проекте найдите файл заголовка и добавьте файл заголовка с именем: stdafx.h: после успешного выполнения.
1>myproject\some.cpp4 : фатальная ошибка C1083: невозможно открыть. Похоже, это связано с тем, что исходный файл PCH находится не в том же каталоге, что и проект. Поэтому, когда я иду собирать проект, VS2015 говорит, что не может скомпилировать./pch.cpp. Это не имеет ничего общего с поиском файла stdafx.h или.
В компьютерном программировании предварительно скомпилированный заголовок PCH представляет собой файл заголовка C или C++, который используется при компиляции source.cpp в первый раз с включенной функцией предварительно скомпилированного заголовка. afx в stdafx.h обозначает расширения фреймворка приложения. механизм предварительной компиляции PCH в clang разрешает произвольный доступ.
Файл .pch создается в результате компиляции файла stdafx.cpp. Например, ниже приведен файл stdafx.h, который мы используем в PVSStudio, текст статьи сокращен для статьи: Сторонние библиотеки, включенные в проект в качестве исходных файлов, вызывают некоторую фатальную ошибку C1083: Не удается открыть предварительно скомпилированный заголовочный файл:.
устранена фатальная ошибка Visual Studio c1083 в ненужных файлах. появилось красное подчеркивание, говорящее, что невозможно открыть исходный файл stdafx.h. В Microsoft Visual C Environment Codeproject..did в Visual Studio 2017 Неустранимая ошибка C1083 Не удается открыть Включить файл Pthread H Нет такого файла или каталога Microsoft Q A.
Прокрутите вниз, пока не увидите установку Visual Studio; Нажмите изменить; Когда появится всплывающее окно, нажмите «Изменить»; В разделе «Языки программирования» > «Visual C++» убедитесь, что «Основные классы Microsoft для C++» установлены, если они не выбраны, и нажмите «Обновить». Для VS2019 приведенные выше решения мне не помогли.
Не удается сгенерировать код C++ из-за фатальной ошибки C1083 Matlab. 25 августа 2019 г. Я извиняюсь за задержку с этим продолжением, эти форумы капризничают. Visual C++ и Windows включают пути. ошибка C1083: Не удается открыть файл xyz.h в другом месте, чтобы препроцессор мог его найти или еще что-то.
IntelliSense: невозможно открыть исходный файл stdafx.h[IntelliSense: невозможно открыть исходный файл stdafx.h] Свойства проекта > Свойства конфигурации > C/C++ > Общие создать проект. Мы выбираем Windows, когда вы решите поддерживать Docker.
Закрыто. kks010 открыл этот выпуск 29 июля 2020 г. 12 комментариев. Закрыто Ошибка C1083 Не удается открыть включаемый файл. Дело не только в том, что скрипт VS не выполняет всю сборку: дополнительный шаг — это то, что мы решили вообще не требовать.
Глупый я! я не регистрировался в проекте кода как участник, поэтому я не могу это сделать! Если исходный файл включает stdafx.h, то vld.h должен быть включен после него. d:\codes\data.h3 : фатальная ошибка C1083: не удается открыть включаемый файл: 'streamio': нет.
Неустранимая ошибка UE4 C1083: Не удается открыть включаемый файл: DDCommon.h: Нет такого файла или каталога компиляции видео босс настолько гладкий, что мой собственный не компилируется. На самом деле было обнаружено сообщение об ошибке, указанное в заголовке этой статьи.
Привет, я пытаюсь написать код на С++, это простой код, который включает в себя решение ошибки Active E1696, не может открыть исходный файл stdafx.h. Я не могу заставить компилятор подавлять массивные предупреждения в windows.h, когда я переношу его в .
Привет, я пытаюсь написать код на C++. Это простой код, который включает решение ошибки Hanoi Tower Error active E1696, не удается открыть исходный файл stdafx.h. Вы можете использовать их для ускорения компиляции, если хотите, но это не обязательно.< /p> <р>. компиляция кода Microsoft Visual C++, сгенерированного IBM Rational Rose: Невозможно открыть включаемый файл: 'stdafx.h': Нет такого файла или каталога? диалоговое окно и на вкладке Включает удалить текст в Начальные исходные включения.
Файл stdafx.h обычно используется как предварительно скомпилированный заголовочный файл. Если предварительно скомпилированный заголовок не используется, это включение не должно быть включено. Чтобы отключить его, откройте диалоговое окно «Свойства компонента Visual C++» и «Контакты и отзывы».
<р>. от IBM Rational Rose: не удается открыть включаемый файл: «stdafx.h»: нет такого файла или каталога? Как говорится в сообщении об ошибке, компилятор находит включение на вкладке «Включает», удаляет текст в «Исходные включения исходного кода».Это сообщение появляется во время компиляции Microsoft Visual C++ с помощью IBM Rational Rose: Не удается открыть включаемый файл: 'stdafx.h': Нет такого файла или и на вкладке Включает удалить текст в начальном исходном включении.
E1696 не может открыть исходный файл stdafx.h во время компиляции Оба описанных выше подхода не решают проблему. Это проект MFC на vs2015, я также включаю некоторые функции ядра, основанные на cuda. есть три у.е. и.
Ошибка C1083 Не удается открыть включаемый файл: «stdafx.h»: нет такого файла или каталога. я пытался отлаживать миллионы раз, я пытался найти решение в Интернете, но безрезультатно. можно.
Предварительно скомпилированные заголовки. Разбор заголовочных файлов системных библиотек на удивление дорог. Типичный исходный файл содержит менее тысячи строк кода. Напротив.
Запросить функцию. Нам не удалось получить этот отзыв. Это может быть потому, что у вас нет доступа к нему или он не существует. Повторите попытку после входа.
В предварительно скомпилированном формате заголовка Clang десериализация объявления, являющегося DeclContext, представляет собой операцию, отдельную от десериализации всех сохраненных объявлений.
Заголовки префиксов обычно предварительно компилируются, чтобы сократить время компиляции. Использование заголовков префиксов не по назначению может усложнить код.
Недавно я столкнулся с проблемой, что некоторые перкомпилированные заголовки, такие как stdafx.h, почему-то недоступны в MinGW. Я знаю, что есть и другие компиляторы.
Не удается открыть включаемый файл: 'stdafx. h': Нет такого файла или каталога 2 ; ошибка: окна. больше, чтобы открыть и обработать исходники. h отсутствует в Visual Studio 2015 RC.
cpp файлы ясно, что StdAfx.h включает в себя все заголовки, которые должны быть предварительно скомпилированы, в то время как StdAfx.cpp отвечает за создание файла .pch. В VS выбираем
Ошибка C++ Visual Studio 2017 Невозможно открыть включаемый файл:.h: ни один такой файл или код C++ не столкнется с этой проблемой, думая, что включаемый каталог не существует.
Использование функции strcpy в vs2019 сообщит об ошибке, общее значение которой заключается в том, что функция небезопасна, рекомендуется использовать функцию strcpys
Я скачал код онлайн, и после открытия vs2015 возникает проблема: Не удается открыть исходный файл math.h Причина: Этот проект был написан в> vs2015.
Возможно, у вас нет к нему доступа или он не существует. Повторите попытку после входа. Сведения об ошибке: [
Прибрежные системы являются одними из самых динамичных физических систем на земле и подвержены фатальной ошибке RC1015: невозможно открыть включаемый файл 'afxres.h'.
В компьютерном программировании предварительно скомпилированный заголовок PCH представляет собой заголовочный файл C или C++, который скомпилирован в промежуточную форму, которая быстрее обрабатывается.
Несмотря на то, что он выдает такую ошибку, компилятор работает успешно. Эта проблема будет возникать при разработке в младших версиях VS2005/VS2008 и.
h, вызывающий странные ошибки во время компиляции. Довольно часто все заканчивается тем, что они старательно отключают все предкомпилированные заголовки в каждом проекте.
Вам необходимо проверить настройки проекта в C++, проверить включенные каталоги и убедиться, что это ошибка C++: невозможно открыть исходный файл stdafx.h CodeProject.
Указывает компилятору создать предварительно скомпилированный файл header.pch, который представляет состояние компиляции в определенный момент. Синтаксис. /Yc /Ycимя_файла.
На Reddit было проголосовано множество статей о том, что sourceforge — это Спасибо за ваше понимание. Я получил несколько ошибок, не включая stdafx.h, но добавляя его.
Ошибка C++: невозможно открыть исходный файл stdafx.h CodeProject.Насколько мне известно, это Учебник по программированию на C 10 Создание файла заголовка YouTube. Имя.
<р>. Ошибка C1083 Не удается открыть включаемый файл: 'trcRecorder.h': такого файла нет или не добавлен код средства записи трассировки, и это является причиной вашей проблемы.Затем компилятор получает указание предварительно скомпилировать этот заголовочный файл. Это создает новый файл, который теперь находится в двоичном формате, доступном только для компилятора.
Хорошо, если один из предварительно скомпилированных заголовков изменится, Visual Studio автоматически воссоздаст файл .pch для вас. Итак.
Насколько мне известно, это предварительно скомпилированный заголовочный файл. Он помогает ускорить работу приложения C++. Обратите внимание на двойные кавычки, что означает это.
Насколько мне известно, это предварительно скомпилированный заголовочный файл. Он помогает ускорить работу приложения C++. Обратите внимание на двойные кавычки, что означает это.
Во-вторых: не рекомендуется включать предварительно скомпилированный заголовок в ваши собственные заголовки, чтобы не загромождать пространство имен другого источника, который может использовать ваш.
Насколько мне известно, это предварительно скомпилированный заголовочный файл. Он помогает ускорить работу приложения C++. Обратите внимание на двойные кавычки, что означает это.
Во-вторых: не рекомендуется включать предварительно скомпилированный заголовок в ваши собственные заголовки, чтобы не загромождать пространство имен другого источника, который может использовать ваш.
Насколько мне известно, это предварительно скомпилированный заголовочный файл. Он помогает ускорить работу приложения C++. Обратите внимание на двойные кавычки, что означает это.
Файл stdafx.h обычно используется как предварительно скомпилированный заголовочный файл. Предварительно скомпилированные заголовки помогают ускорить компиляцию, когда группа файлов находится в одном.
Сбой сборки: отсутствует файл afxres.h, принадлежащий MFC. Что может и не смог найти вариант с названием именно MFC для x86 и x64.
Я использую Microsoft Visual C++ 2010 Express. Когда я пытаюсь собрать решение Everything.sln, он говорит, что отсутствуют 2 файла. Ниже приведен а.
В вашем случае, поскольку вы, вероятно, начали с проекта шаблона, он использовался для включения Windows.h только для макроса TCHAR. Затем прекомпилируется.
<р>. в Visual Studio 2019 и скомпилируйте все решение или только проект A. Я получаю сообщение об ошибке E1696, не могу открыть исходный файл stdafx.h.h, как я всегда делал в Visual Studio 2017, появилось изогнутое красное подчеркивание, говорящее, что невозможно открыть исходный файл stdafx.h. Когда.
Не удается открыть файл типа файла: 'файл': сообщение. Компилятор Большинство заголовочных файлов стандартной библиотеки C++ не имеют расширения имени файла a.h.
Это сообщение появляется во время компиляции кода Microsoft Visual C++, сгенерированного IBM Rational Rose: Не удается открыть включаемый файл:.
h /.cpp file: не удается открыть исходный файл stdafx.h, некоторые найденные методы не работают. Несмотря на эту ошибку, программа успешно запущена.
В проекте C++, когда вы включили заголовочный файл, но внутри проекта мы не можем получить доступ к этому заголовочному файлу, обычно мы получаем ошибку, связанную с невозможностью открытия исходного файла. Для исправления этой ошибки проверьте, доступен ли включаемый файл в пути включения проекта или нет.
не удается открыть файл с исходным кодом Visual Studio C++
Решение 1. Проверьте настройки проекта Visual Studio в разделе C++, установите флажок Включить каталоги и убедитесь, что Your_filename.h указывает правильный путь. После добавления правильных включаемых каталогов он устранит ошибку Visual Studio, не позволяющую открыть исходный файл.
включить каталоги в файл заголовка
Вы можете щелкнуть правой кнопкой мыши файл заголовка и открыть его в Visual Studio. Если файл указывает правильно, он откроется.
Щелкните правой кнопкой мыши и попробуйте открыть заголовочный файл
Если ваш включаемый файл не указывает правильно или вы не добавили в свой включаемый каталог, вы не сможете открыть его из Visual Studio.
если файл не включен в проект, выдайте эту ошибку
Решение 2. Еще одно решение. Если ваш заголовочный файл находится в другой папке/местоположении, вы можете включить путь к файлу непосредственно в заголовочный файл. Здесь вы можете использовать относительный путь или указать полный путь к заголовочному файлу.
Включить в зависимости от структуры папок вашего проекта и требований.
c++ не может открыть исходный файл iostream
Решение-1: ошибка открытия файла iostream обычно возникает, когда отсутствует $(IncludePath) внутри Свойства->Каталоги VC++->Включить каталоги. И вы по ошибке удалили Включить путь.
Решение 2. Другая возможная причина заключается в том, что при установке Visual Studio вы не выбрали пакеты C++.
Решение 3. Вы можете проверить это, включив stdafx.h при запуске (только для проектов Visual Studio)
Решение 4. Иногда такие ошибки возникают, когда на одном компьютере установлено несколько версий Visual Studio. Вы можете проверить Проекты и решения -> Каталоги VC++, правильно ли они добавлены для вашего проекта и указывают на правильное местоположение версии.
Для кода Visual Studio:
С++ не может открыть исходный файл iostream в коде Visual Studio. Это также может произойти, если в файл c_cpp_properties.json кода Visual Studio не добавлены правильные пути.
не удается открыть исходный файл «string»
Попробуйте выполнить следующие действия, чтобы устранить ошибку.
1) Параметр «Открыть каталоги VC++» в свойствах конфигурации Visual Studio
2) Будут доступны все ее значения каталогов (например, исполняемые каталоги), просто вам нужно выбрать раскрывающийся список и нажать «Изменить»
3 ) Удалите выбор «Наследовать от родителя»
4) Теперь просто нажмите «ОК», и вы не увидите никаких изменений в поле «Редактировать».
5) Вам нужно повторить это для всех каталогов. В конце исполняемые каталоги будут установите значение $(ExecutablePath), а для каталогов Include будет установлено значение $(IncludePath), аналогично всем каталогам
6) Теперь нажмите «Применить», а затем «ОК».
Вывод: невозможно открыть исходный файл c++
Мы предоставили решения для нескольких ошибок, связанных с невозможностью открытия исходного файла c++. Если вы попробуете данное решение, надеюсь, вы сможете устранить ошибку. Но если вы все еще получаете сообщение об ошибке, вы можете добавить свой комментарий и код. Мы постараемся решить и найти решение для вас. Удачного кодирования 🙂
Эта статья предназначена для тех программистов, которые только начинают работать в среде 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 уже созданы для вас, а также определены все необходимые параметры компиляции.
Если вы не использовали параметр предварительно скомпилированных заголовков в своем проекте, давайте узнаем, как его включить. Предлагаю следующий алгоритм:
- Включить предварительно скомпилированные заголовки во всех конфигурациях для всех файлов *.cpp. Это можно сделать на вкладке «Предварительно скомпилированный заголовок»:
- Установите значение «Использовать (/Yu)» для параметра «Предварительно скомпилированный заголовок».
- Установите «stdafx.h» для параметра «Предварительно скомпилированный файл заголовка».
- Установите «$(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»: нет такого файла или каталога
- Файл stdafx.cpp еще не скомпилирован, поэтому файл *.pch еще не создан. Это может произойти, например, когда вы сначала очищаете решение, а затем пытаетесь скомпилировать один файл *.cpp (Компилировать Ctrl-F7). Чтобы решить проблему, скомпилируйте все решение или хотя бы файл stdafx.cpp.
- В настройках не указан файл для генерации файла *.pch, то есть проблемы с ключом компиляции /Yc. Эта проблема характерна для новичков в Visual Studio, которые впервые пытаются использовать предварительно скомпилированные заголовки в своем проекте. Чтобы узнать, как это сделать правильно, см. выше раздел «Как использовать предварительно скомпилированные заголовки».
Текст ошибки говорит сам за себя, если вы потрудитесь его прочитать. Файл компилируется с ключом /Yu. Это означает, что должен использоваться предварительно скомпилированный заголовок, но в файле отсутствует «stdafx.h».
Если вы не можете этого сделать, не используйте предварительно скомпилированный заголовок для этого файла *.c/*.cpp. Удалите переключатель /Yu.
Неустранимая ошибка C1853: предварительно скомпилированный заголовочный файл «project.pch» относится к предыдущей версии компилятора, или предварительно скомпилированный заголовок относится к C++, и вы используете его из C (или наоборот)
Проект содержит файлы C (*.c) и C++ (*.cpp). Для них нельзя использовать общий предварительно скомпилированный заголовок (файл *.pch).
- Отключить предварительно скомпилированные заголовки для всех C-файлов. Практика показывает, что файлы *.c препроцессируются в несколько раз быстрее, чем файлы *.cpp. Если у вас всего несколько файлов *.c, вы не потеряете в производительности, отключив для них предварительно скомпилированные заголовки.
- Создайте два предварительно скомпилированных заголовка. Первый должен быть сгенерирован из 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 и проверить свою программу на наличие ошибок.
Заключение
Как видите, работать с предварительно скомпилированными заголовками довольно просто. Программисты, которые пытаются их использовать и постоянно сталкиваются с «многочисленными ошибками компилятора», просто не понимают принципов работы этого механизма. Мы надеемся, что эта статья помогла вам преодолеть это недоразумение.
Предварительно скомпилированные заголовки — очень полезная опция, позволяющая значительно повысить скорость компиляции проекта.
Читайте также: