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

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

  1. настройте проект на использование предварительно скомпилированных заголовков с директивой YU.
  2. создайте свой stdafx.H файл и установите его в качестве предварительно скомпилированного заголовка.
  3. включите это в качестве верхнего оператора include в каждом из ваших .H-файлы.

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

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

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

/ Od / I "../ Внешний / PlatformSDK / Включить" / I ".." /Я "../ Внешний / atlmfc / включить" /D "_DEBUG" /D "_UNICODE" / D "UNICODE" /Gm /EHsc /RTC1 /MDd / Yc"stdafx.ч" /Планирование семьи."...OutputLudoCoreDebugLudoCore.ПЧ" /Fo"....ВыводLudoCoreОтладка" /Fd"....OutputLudoCoreDebugvc80.распределительная плата" /W4 / WX / nologo /c / ZI /TP / wd4201 / errorReport: запрос

4 ответов


вы 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

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

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

конфигурация, которую вы хотите:

  1. на уровне проекта с "всеми конфигурациями" выбранный (свойства проекта, изменить конфигурацию выпадающего из отладки/выпуска), установите предварительно скомпилированный заголовок "использовать"
  2. выберите a .cpp-файл должен быть источником заголовка (насколько я знаю, не имеет значения, какой из них)
  3. щелкните правой кнопкой мыши и выберите Свойства goto и выберите "Создать" для предварительно скомпилированного заголовка
  4. наконец убедитесь, что нет другого .cpp-файлы имеют значения, установленные для свойства предварительно скомпилированного заголовка (вы можете сказать жирным шрифтом)

код #include "stdafx.h" должна быть первая строка каждого файла cpp. Он не должен использоваться в .H-файлы. В остальном ты прав.


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

соответствующие компоненты в файл X. H в листинг заголовков precompilable, файл x.cpp что включает в себя только X. ч (и добавляет себя без кода), и файл X. ПЧ, созданный путем компиляции X.cpp (и, следовательно, X. h) с параметром компилятора /Yc.

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