为什么要使用预编译头文件 (C/C++)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/903228/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why use precompiled headers (C/C++)?
提问by Billy ONeal
Why use precompiled headers?
为什么要使用预编译头?
Reading the responses, I suspect what I've been doing with them is kind of stupid:
阅读这些回复,我怀疑我对他们所做的事情有点愚蠢:
#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"
采纳答案by rlbond
It compiles a lotquicker. C++ compilation takes years without them. Try comparing some time in a large project!
它编译一个很大更快。没有它们,C++ 编译需要数年时间。尝试在大型项目中比较一些时间!
回答by Todd Gardner
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.
在 C/C++ 中,#include 机制是指定文件到当前文件的文本副本。标头包括其他标头(其中还包括其他标头),因此当您执行 #include 时,它可能会在每个 cpp 文件(或 cxx、c 等)中添加数万行 C++,所有这些都需要每次编译。这可能是大型项目的严重瓶颈。
Precompiled headers speed this up by compiling each header once, then including that compiled state into the cpp they are included in.
预编译头通过将每个头编译一次,然后将该编译状态包含到包含它们的 cpp 中来加快此过程。
回答by Daniel Earwicker
Re: your current usage, if you have a target with a very large number of files, it may still be faster to use PCH in that way - try switching them off to find out. It depends: if you have a lot of headers of your own, and you change them only infrequently, and you have a very large number of source files that you change much more frequently, then your PCH usage will cut rebuild times.
回复:您当前的使用情况,如果您有一个包含大量文件的目标,以这种方式使用 PCH 可能仍然更快 - 尝试将它们关闭以找出答案。这取决于:如果您有很多自己的标头,并且很少更改它们,并且您有大量的源文件并且更改的频率更高,那么您的 PCH 使用将减少重建时间。
But normal advice is to only put things in PCH that never change, because there is a certain overhead to producing the PCH itself. If you trigger that off with every rebuild (by constantly tweaking one of your headers), using PCH may make the rebuild slower.
但通常的建议是只将永远不会改变的东西放在 PCH 中,因为产生 PCH 本身有一定的开销。如果您在每次重建时触发它(通过不断调整您的一个标头),使用 PCH 可能会使重建速度变慢。
回答by swongu
It speeds up compilation.
它加快了编译速度。
When you're including headers from other projects, you don't expect to change them. If you put these into a precompiled header, then that code will not have to be recompiled when you make changes to your source code. This reduces repetitive compilation of unchanged code, speeding up compile time.
当您包含来自其他项目的标题时,您不希望更改它们。如果将它们放入预编译的头文件中,那么在更改源代码时就不必重新编译该代码。这减少了对未更改代码的重复编译,加快了编译时间。
回答by n8gray
So you don't have to compile them every time you build your project. They're used for system headers that aren't going to change.
因此,您不必每次构建项目时都编译它们。它们用于不会更改的系统标头。