Используют ли предварительно скомпилированные заголовки предварительно скомпилированные заголовки, если они включены, или они предназначены только для файлов .cpp?

Visual Studio 2022:

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

  • Будет ли непредкомпилированный заголовок использовать предварительно скомпилированные заголовки или он будет снова генерировать код при каждой компиляции?

Цена за конверсию:

#pragma once
#include "Precompiled.h"
#include "No-Precompiled.h" // Basic Headers: Windows.h, Psapi.h

int main()
{
    // Functions that I need from "No-Precompiled.h" but I can't Precompile it since changes in it are made on regular basis
}

Предварительно скомпилированный.h:

#pragma once
#include <windows.h>
#include <Psapi.h>
#include <d3d11.h>

class Template
{
public:
    //Functions that need many same Headers.
}

Предварительно скомпилированный.h:

#pragma once
#include <windows.h>
#include <Psapi.h>
#include <d3d11.h>
#include <limits>
#include <complex>
#include <filesystem>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <tchar.h>
#include <wincred.h>
#include <complex>
#include <math.h>
  • Должен ли я просто предварительно скомпилировать заголовки, которые использует файл .cpp (что немного), или есть способ разрешить заголовкам без предварительной компиляции использовать предварительно скомпилированные заголовки?

Он снова перекомпилирует его, и во время компоновки вы получите конфликты символов.

Kyle 16.05.2022 22:56

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

Frank 16.05.2022 22:56

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

paddy 16.05.2022 23:02

@paddy Использование #pragma once, как это делает OP, устраняет необходимость повторной загрузки заголовка при последующих включениях. Я бы сказал, что в настоящее время поддержка заголовков, которые не требуют предварительного включения, через pch или иным образом, дает достаточно преимуществ для поддержки, чтобы противодействовать потере производительности.

Frank 16.05.2022 23:12

@Frank Я говорю о таких вещах, как #include <windows.h>и т.д, которые будут срабатывать для каждого исходного файла, содержащего непредварительно скомпилированные материалы. В частности, этот большой заголовок использует нет#pragma once и все равно должен быть проанализирован препроцессором, даже если защита установлена ​​путем его включения в предварительно скомпилированный заголовок.

paddy 16.05.2022 23:18

@paddy Даже тогда я бы спокойно сказал, что это следует рассматривать как крайнюю меру, которую следует принимать, когда время компиляции слишком велико, и это заметно оказывает сильное влияние, а не практику «по умолчанию».

Frank 16.05.2022 23:32
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
6
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование предварительно скомпилированных заголовков мало что меняет. В частности, продолжают работать защитные щитки. Защита заголовка для <windows.h> также включена в предварительно скомпилированное состояние. Следовательно, когда компилятор видит <windows.h> во второй раз, он сразу же пропускается.

В вашем случае заголовок No-Precompiled.h оказывается довольно тривиальным, так как все его заголовки уже включены. Вы просто компилируете Template.

Однако я бы немного задумался о конкретном наборе предварительно скомпилированных заголовков. PSapi и DirectX и IOstream? Я не могу представить себе большую программу, в которой у вас есть много файлов, использующих их все. Обратите внимание, что <iostream> на самом деле означает std::cout, что не имеет особого смысла для программ DirectX.

"PSapi и DirectX и IOstream? Я не могу представить себе большую программу, в которой у вас есть много файлов, использующих их все." Основное ограничение прекомпилированных заголовков в том, что у вас может быть только один, так что вам как бы надо впихнуть в него все, что вы используете куда угодно. То есть вы делаете это, если хотите получить от них преимущества во время компиляции.

Nicol Bolas 17.05.2022 04:51

Другие вопросы по теме

Похожие вопросы

Введите каламбур в константном / статическом инициализаторе (построение константы с плавающей запятой из битов)
Могу ли я добавить другую функцию, определенную в моем коде, в вектор, такой как массивы, которые включают адрес функции?
Есть ли способ «сбросить» переменные функций?
Ошибка C2679: бинарный '>>': оператор не найден
Не удается вызвать указатель функции структуры на метод класса
Как работает параметр приблизительноPolyDP и эпсилон?
Как вставить запись в Microsoft Access с помощью MFC?
Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок.
Привязка rvalue ref к строковому литералу в конструкторе по сравнению с построением на месте
ROOT (CERN): постройте фигуру с планками погрешностей, используя данные из файла csv.