Почему использование предварительно скомпилировало заголовки (C/C++)?

Почему использование предварительно скомпилировало заголовки?


Читая ответы, я подозреваю то, что я делал с ними, довольно глупо:

#pragma once

// Defines used for production versions

#ifndef PRODUCTION
#define eMsg(x) (x) // Show error messages
#define eAsciiMsg(x) (x)
#else
#define eMsg(x) (L"") // Don't show error messages
#define eAsciiMsg(x) ("")
#endif // PRODUCTION

#include "targetver.h"
#include "version.h"

// Enable "unsafe", but much faster string functions
#define _CRT_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS

// Standard includes
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <direct.h>
#include <cstring>
#ifdef _DEBUG
#include <cstdlib>
#endif

// Standard Template Library
#include <bitset>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
#include <numeric>

// Boost libraries
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/scoped_array.hpp>

//Windows includes
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "FILETIME_Comparisons.h"
#include <shlwapi.h>
#include <Shellapi.h>
#include <psapi.h>
#include <imagehlp.h>
#include <mscat.h>
#include <Softpub.h>
#include <sfc.h>
#pragma comment(lib, "wintrust.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"Psapi.lib")
#pragma comment(lib,"shlwapi.lib")
#pragma comment(lib,"imagehlp.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Shell32.lib")
#pragma comment(lib,"Sfc.lib")
#pragma comment(lib,"Version.lib")

// Crypto ++ libraries
#ifdef _DEBUG
#pragma comment(lib,"cryptlibd.lib")
#else
#pragma comment(lib,"cryptlib.lib")
#endif
#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include <md5.h>
#include <sha.h>

// String libraries
#include "stringUnicodeConversions.h"
#include "expandEnvStrings.h"
#include "randomString.h"
#include "getShortPathName.h"

// Regular Expression Libraries
#include "fpattern.h"

// File Result Record
#include "unixTimeToFileTime.h"
#include "fileData.h"

// Writer
#include "writeFileData.h"

// Criteria Structure System
#include "priorities.h"
#include "criterion.H"
#include "OPSTRUCT.H"
#include "regexClass.H"
#include "FILTER.h"

// Sub Programs Root Class
#include "subProgramClass.h"

// Global data
#include "globalOptions.h"

// Logger
#include "logger.h"

// Console parser
#include "consoleParser.h"

// Timeout handler
#include "timeoutThread.h"

// Zip library
#include "zip.h"
#include "unzip.h"
#include "zipIt.h"

// Scanner
#include "mainScanner.h"
#include "filesScanner.h"

// Sub Programs
#include "volumeEnumerate.h"
#include "clsidCompressor.h"
#include "times.h"
#include "exec.h"
#include "uZip.h"

// 64 bit support
#include "disable64.h"
42
задан Peter Mortensen 29 June 2019 в 18:05
поделиться

5 ответов

Он составляет лот быстрее. Компиляция C ++ без них занимает годы. Попробуйте сравнить время в большом проекте!

39
ответ дан 26 November 2019 в 23:23
поделиться

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

7
ответ дан 26 November 2019 в 23:23
поделиться

In C/C++, the #include mechanism is a textual copy of the file specified into the current file. Headers include other headers (which include yet other headers), so when you do a #include, it could be adding tens of thousands of lines of C++ into each cpp file (or cxx, c, whatever), all of which need to be compiled each time. This can be a sever bottleneck for large projects.

Precompiled headers speed this up by compiling each header once, then including that compiled state into the cpp they are included in.

56
ответ дан 26 November 2019 в 23:23
поделиться

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

Но нормальный совет - помещать в PCH только те вещи, которые никогда не меняются, потому что есть определенные накладные расходы на создание самого PCH. Если вы активируете это при каждой перестройке (постоянно настраивая один из заголовков), использование PCH может замедлить перестройку.

10
ответ дан 26 November 2019 в 23:23
поделиться

Ускоряет компиляцию.

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

7
ответ дан 26 November 2019 в 23:23
поделиться