Что делает #pragma hdrstop без параметра при использовании в нескольких файлах? - PullRequest
10 голосов
/ 02 сентября 2011

Какова практическая ценность («что он делает») помещения #pragma hdrstop (без параметра имени файла) в пару файлов исходного кода (cpp)?

Обратите внимание, что документы MSDN (еще раз) для меня ясны, как грязь.

Редактировать / Примечание: я спрашиваю об этом, потому что этот ответ и статья, на которую он ссылается, похоже, рекомендует,Но я не понимаю, какую выгоду имеет отдельный файл pch для каждой единицы компиляции.

Ответы [ 3 ]

11 голосов
/ 04 июля 2013

Ответ на исходный вопрос заключается в том, что целью использования #pragma hdrstop в файле, для которого не задан ни / Yc, ни / Yu, является то, что он игнорируется, и поэтому вы можете настроить конфигурацию сборки, которая собирается без предварительно скомпилированных заголовков и других сборок. конфигурации, которые создают скомпилированные заголовки WITH, и вам не нужно менять код или заголовки, которые вообще включены для этого.

Подробнее ...

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

В двух словах.

  • Помещение #pragma hdrstop в исходный файл, который не скомпилирован с / Yc или / Yu, не имеет никакого эффекта.
  • Если для файла задана опция / Yu, то hdrstop говорит компилятору выбросить все до строки, в которой появляется hdrstop, и вместо этого вставить предварительно скомпилированный заголовок.
  • Если для файла задан параметр / Yc, то hdrstop означает сохранить все скомпилированное состояние для всего, вплоть до строки, в которой hdrstop отображается как предварительно скомпилированный заголовок.

Хитрость заключается в использовании / Yc и / Yu без необязательного имени файла заголовка; просто отметьте переключатель «использовать» или «создать» и оставьте поле редактирования «сквозной заголовок» пустым (или отредактируйте файл проекта ...).

Итак, у вас есть 1 файл, возможно, с именем PrecompiledHeader.cpp, который включает в себя заголовки, которые вы хотите включить в предварительно скомпилированный заголовок, и который имеет #pragma hdrstop в конце списка включаемых файлов. Этот ОДИН файл скомпилирован с /Yc.

Затем у вас есть все остальные ваши cpp-файлы с #pragma hdrstop после включаемых файлов, которые находятся в вашем предварительно скомпилированном заголовке. Эти файлы все скомпилированы с /Yu.

Это приводит к тому, что PrecompiledHeader.cpp создает ваш (в этом примере) один файл pch и все остальные файлы, используя этот единственный файл pch.

Преимущество в этом заключается в том, что НИКАКИЕ из ваших файлов не должны включать в себя «глобальный» предварительно скомпилированный заголовочный файл построения заголовка - поэтому нет stdafx.h или чего-либо еще. Это означает, что вы можете настроить конфигурацию сборки, которая собирает БЕЗ предварительно скомпилированных заголовков, где все строки #pragma hdrstop просто игнорируются.

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

5 голосов
/ 02 сентября 2011

Весь код до #pragma hdrstop будет частью предварительно скомпилированного заголовка.Если параметр имени файла не указан, именем заголовка будет базовое имя исходного файла с расширением .PCH, как указано в документации :

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

  1. Аргумент для параметра компилятора / Fp

  2. Аргумент имени файла для #pragma hdrstop

  3. Базовое имя исходного файла с расширением .PCH

Итак, если выимейте это в файле с именем blah.cpp, он создаст файл с именем blah.pch, IFF скомпилированный с /Yc (который должен быть установлен только один файл).

4 голосов
/ 02 июля 2013

Если вы не используете #pragma hdrstop в своем проекте C / C ++, у вас есть выделенный файл .cpp в качестве исходного файла для созданного .pch.

Если используется #pragma hdrstop в файле .cppс помощью которого вы хотите создать файл .pch, файл .cpp может иметь другое полезное содержимое после строки #pragma hdrstop.Когда вы впервые компилируете этот файл .cpp с опцией компиляции / Yc, вы получите файл .pch и файл .obj.Когда вы изменяете файл .cpp и перекомпилируете его с параметром компиляции / Yu, компилятор заменяет содержимое строки #pragma hdrstop на файл .pch и перекомпилирует деталь после строки #pragma hdrstop, создавая новый файл .obj.файл, сохраняя время компиляции.Очень полезно, чтобы у вашего проекта был только один исходный файл.

Для исходных файлов, использующих только файлы прекомпиляции заголовков, #pragma hdrstop является ориентиром для компилятора, часть которого должна быть заменена файлом .pch,поэтому вам не нужно указывать имя файла заголовка с параметром компиляции / Yu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...