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

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

Я понимаю цель и аргументы в отношении предварительно скомпилированных заголовков. Однако каковы правила при их реализации? По моему мнению, это выглядит примерно так:

  • Задайте проект для использования предварительно скомпилированных заголовков с директивой YU.
  • Создайте файл stdafx.h и установите его как ваш предварительно скомпилированный заголовок.
  • Включить это как верхний оператор include в каждый из ваших .h файлов.

Это правильно? Следует ли исключать включение его в файлы, включенные в ваш предварительно скомпилированный заголовок? В настоящее время я получаю следующую ошибку компиляции, следуя моей интуиции:

ошибка C2857: оператор'include ' указанный с /Ycstdafx.h опция командной строки не была найдена в исходный файл

Параметры командной строки таковы:

/Od/I "../External/PlatformSDK/Include" /I ".." /I "../External/atlmfc/Include" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /Gm/EHsc/RTC 1/MDd/Yc "stdafx.h" /Fp "....\Output\LudoCore\Debug\LudoCore.pch" /Fo "....\Output\LudoCore\Debug \" /Fd "....\Output\LudoCore\Debug\vc80.pdb" /W 4/WX/nologo/c/ZI/TP/wd4201 /ErrorReport: подсказка

4b9b3361

Ответ 1

Вы stdafx.cpp должны включать stdafx.h и быть построены с помощью /Yc"stdafx.h".

В ваш другой *.cpp должен быть включен stdafx.h и быть создан с помощью /Yu"stdafx.h".

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

Вот скриншот настроек Visual Studio для stdafx.cpp для создания предварительно скомпилированного заголовка:

create precompiled header

Вот соответствующие параметры командной строки (которые доступны только для чтения, но отражают настройки, указанные на других страницах, обратите внимание, что среда IDE вставляет символы двойной кавычки вокруг имени файла в опции компилятора):

options

Это то, что в моем файле stdafx.cpp:

// stdafx.cpp : source file that includes just the standard includes
// CallWinsock.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

Ответ 2

Visual studio может хранить предварительно скомпилированные свойства заголовка не только по проекту, но и по исходному файлу.

По умолчанию для всех свойств задано значение "inherit from parent или project defaults", которое просто показывает значение родительского объекта для этого свойства, но после переопределения на дочернем уровне (в данном случае файла .cpp) файл игнорирует изменения из родительское свойство.

Требуемая конфигурация:

  • На уровне проекта с выбранными параметрами "Все конфигурации" (свойства проекта, изменение конфигурации выпадаете из отладки/выпуска), Установите свой предварительно скомпилированный заголовок в "Использовать"
  • Выберите файл .cpp, который будет источником заголовка (насколько я знаю, не имеет значения, какой)
  • Свойства правого клика и goto и выберите "Создать" для предварительно скомпилированного заголовка
  • Наконец, убедитесь, что никакие другие .cpp файлы не имеют значений, заданных для прекомпилированного свойства заголовка (вы можете выделить жирным шрифтом)

Ответ 3

Ваш #include "stdafx.h" должен быть первой строкой каждого файла cpp. Его нельзя использовать в файлах .h. Помимо этого вы правы.

Ответ 4

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

Соответствующие компоненты - это список файлов Xh, содержащих предварительно скомпилированные заголовки, файл X.cpp, который включает только Xh (и не добавляет никакого кода), и файл X.pch, созданный путем компиляции X.cpp(и, следовательно, Xh) с компилятором опция /Yc.

Когда вы сейчас компилируете файл Y.cpp с /Yu"X.pch", компилятор читает и отбрасывает все до #include "X.h". В этот момент он заменяет свое внутреннее состояние состоянием, хранящимся в X.pch, за исключением входного потока (остается Y.cpp, указатель файла установлен на следующую строку после #include "X.h").