Подтвердить что ты не робот

Как включить stdafx.h из корневого каталога?

С опцией "Показать все файлы" в VS, я добавил папку и создал новый класс в этой папке. Поскольку я использую предварительно скомпилированные заголовки, мне также нужно включить stdafx.h, который находится в корневом каталоге относительно нового файла класса.

В моем файле cpp у меня есть

#include "..\stdafx.h"

Но я получаю следующую ошибку:

error C1010: неожиданный конец файла при поиске предварительно скомпилированного заголовка. Вы забыли добавить '#include "stdafx.h" в свой источник?

Мое понимание состоит в том, что.. должен инструктировать компилятор идти на один уровень выше?

4b9b3361

Ответ 1

Visual С++ позволяет определить несколько способов настройки предварительно скомпилированных файлов заголовков. Наиболее распространенным является включение его для ВСЕХ исходных файлов на уровне конфигурации проекта. В разделе "Свойства конфигурации/C++/Предварительно скомпилированные заголовки", задав "Предварительно скомпилированный заголовок", выберите "Использовать". То же местоположение, установка "Предварительно скомпилированный файл заголовка", обычно "stdafx.h". Все файлы получат этот параметр (таким образом, конфигурацию в проекте) ЗА ИСКЛЮЧЕНИЕМ....

Один файл отвечает за создание файла PCH. Этот файл обычно является файлом stdafx.cpp в вашем проекте, и в нем обычно ничего нет, кроме #include "stdafx.h". Конфигурирование предварительно скомпилированных заголовков для этого файла, переключитесь с "Использовать" на "Создать". Это гарантирует, что если первичный заголовок для PCH выходит из синхронизации, stdafx.cpp ВСЕГДА скомпилирован сначала для регенерации файла данных PCH. Существуют и другие способы настройки параметров PCH в Visual Studio, но это наиболее распространенное явление.

Это, как говорится, ваша проблема, безусловно, раздражает. Имя файла, которое использовалось для настройки системы PCH и указано как для параметра "Использовать...", так и "Создать..." выше ДОЛЖНО СМЯТЬ ТЕКСТ В ВАШЕМ # ВКЛЮЧЕН ТОЧНО.

Поэтому очень вероятно, что вы можете решить свою проблему, добавив ".." в свой проект, включая каталоги и удалив ".." из вашего оператора #include. вы также можете изменить его на уровне конфигурации проекта как "..\stdafx.h" в качестве сквозного заголовка, но это может быть проблемой, если у вас есть исходные файлы в нескольких папках иерархически.

О, и если вам было не ясно, когда вы просматриваете настройки конфигурации PCH, если вы НЕ хотите использовать PCH для какого-либо конкретного исходного файла (и иногда есть причины), вы можете отключить его для определенных исходные файлы, в противном случае обязательно укажите #include "your-pch-include-file.h" в начале каждого исходного файла (c/cpp и т.д.).

Надеюсь, вы поймаете перерыв.

Ответ 2

Интересно, что трюк, который я использую, не отвечает:

  • Создайте stdafx.h и stdafx.cpp в корневой папке проекта.
  • Перейдите в свойства проекта → предварительно скомпилированные заголовки. Измените на "use".
  • Перейдите в stdafx.cpp, щелкните правой кнопкой мыши свойства → предварительно скомпилированные заголовки. Измените на "create".
  • Перейти к свойствам проекта → advanced; измените "Force include files" на stdafx.h;% (ForcedIncludeFiles)

Не меняйте файл CPP; сохраняйте файлы заголовков такими, какие они есть. Построить как есть.

Нет ввода, нет RSI, нет проблем с включенными дорожками, никакой другой боли и нищеты. И красота в том, что она по-прежнему будет работать, когда вы переместите свое решение на другую платформу. Высокий.

Ответ 3

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

Либо

  • Поместите каталог, в котором stdafx.h находится в каталоге включения компилятора.

    (Свойства - Каталоги VС++ - Включить каталоги: Добавить $(ProjectDir))

или

  1. Если подкаталогов не так много, простой способ обойти сообщение об ошибке выглядит следующим образом:

    • Поместите файл stdafx.h в каждый из ваших подкаталогов, который включает только верхний уровень stdafx.h:
      #include "..\stdafx.h"
    • Напишите #include "stdafx.h" как первую строку всех исходных файлов в ваших подкаталогах, вместо того чтобы включать туда файл верхнего уровня.

Таким образом, все ваши файлы кода используют один и тот же предварительно скомпилированный файл заголовка, и нет другой сложной настройки.

Ответ 4

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

  • В обозревателе решений щелкните правой кнопкой мыши на .cpp файле, выберите "Свойства".
  • Я настоятельно рекомендую выбрать "Все конфигурации" в раскрывающемся списке "Конфигурация".
  • Перейдите к "C/С++" - "Предварительно скомпилированные заголовки".
  • Отрегулируйте "предварительно скомпилированный файл заголовка" с "stdafx.h" на все, что вам нужно (например, в вашем случае "../stdafx.h").

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

  • warning C4627: '#include "<path>"': skipped when looking for precompiled header use.

и

  • fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

которые не дают большого указания на этот или любой другой подход.

Я думаю, они в конечном итоге обратятся к StackOverflow и закончат здесь... Привет, спасибо за чтение.

На этой основе стоит пойти с альтернативами, например, положить $(ProjectDir) в путь Include С++ (в С++\General), но затем это может вызвать путаницу при включении других файлов заголовков.

Ответ 5

Файлы PCH являются более простыми и даже более похожими на Visual Studio. При компиляции файла .cpp, использующего PCH, VS ожидает, что первый текст без комментария/пробела будет #include "PCH_NAME_HERE". PCH_NAME_HERE - это точно имя PCH. Нет каталогов, ничего. Просто имя PCH, указанное в параметрах компилятора.

Если вы собираетесь делать этот каталог fudging, вам нужно изменить параметры компилятора, чтобы каталог, в котором находится PCH, находится в пути поиска каталога. Таким образом, вам не нужно иметь часть ..\.

Ответ 6

Причиной путаницы является то, что Visual Studio рассматривает директиву include, которая включает в себя предварительно скомпилированный заголовок по-разному с другими директивами include. В частности, он не ищет предварительно скомпилированный заголовок, используя подход обычного поиска пути, вместо этого он просто пытается сопоставить директиву include с параметром, определенным в конфигурации проекта, простым сравнением строк.

Конфигурация заголовка предварительного компилятора задана по умолчанию, но может быть переопределена для каждого файла. Обычная глобальная конфигурация (доступная через Свойства проекта → Свойства конфигурации → C/С++ → Предварительно скомпилированные заголовки):

Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch

Эта конфигурация применяется ко всем файлам проекта по умолчанию. Однако config для stdafx.cpp устанавливается на уровне файла и переопределяет значение Precompiled Header для:

Precompiled Header: Create (/Yuc)

Эффект от этого заключается в том, что для любого исходного файла, сконфигурированного для использования предварительно скомпилированного заголовка (который по умолчанию является всеми из них, кроме stdafx.cpp) VS будет искать директиву include, которая соответствует заданному параметру Precompiled Header File. например.

#include "stdafx.h"

Поскольку проверка использует простое сравнение строк вместо любого поиска в каталоге, то (независимо от расположения исходного файла относительно корневого каталога проекта или местоположения файла stdafx.h) используемый путь и имя файла в директиве include должна соответствовать точно той, которая используется в настройке конфигурации файла Precompiled Header File. Неожиданным побочным эффектом этого является то, что если у вас есть подкаталог проекта, содержащий различные исходные файлы, в этих файлах вам не нужно ссылаться на файл stdafx.h, используя относительный путь, например.. \stdafx.h(и если вы делаете VS приведет к возникновению ошибки, указывающей на то, что она столкнулась с окончанием файла при поиске прекомпилированного заголовка).

Просто используйте unadorned #include "stdafx.h", и он будет работать нормально, потому что VS тогда распознает это как директиву для использования предварительно скомпилированного заголовка, и он уже знает, где правильный предварительно скомпилированный заголовок из-за stdafx.cpp Precompiled Конфигурация заголовка установлена ​​на "Создать (/Yc)".

Ответ 7

Я бы предложил использовать:

$(ProjectDir)/pch/my_pch.h

как "предварительно скомпилированный файл заголовка"
и "Дополнительно > Force Include File"

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

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

Ответ 8

Если файлы .cpp и .h вашего проекта живут в разных подкаталогах (не явно в каталоге проекта), это будет хороший стиль кодирования для использования include paths относительно каталога решений (если вы не используете используйте выделенный каталог include). В частности, если у вас есть несколько проектов в решении и им необходимо обмениваться включенными файлами (например, для взаимодействия между проектами, например,.exe и .dll).

Для реорганизации проекта вам необходимо выполнить следующие действия:

  • В каждом проекте укажите дополнительный каталог include $ (SolutionDir): щелкните правой кнопкой мыши по проекту, нажмите "Свойства", перейдите к "Свойства конфигурации" → "C/С++" → "Общие" (чтобы сделать это для всех конфигурации, выберите "Все конфигурации" из Выпадающее меню "Конфигурация".
  • Перейдите к "C/С++" → "Предварительно скомпилированные заголовки" и измените значение "Precompiled Header File" на путь относительно каталог решений, например. PROJECT_NAME/stdafx.h
  • В вашем .cpp файлы включают "PROJECT_NAME/stdafx.h", а не просто "stdafx.h"
  • В ваших файлах .h и .cpp при включении чего-либо используйте путь как "PROJECT_NAME/dir1/dir2/file.h", за исключением случаев, когда файл тот же каталог

Ответ 9

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