当前位置:  开发笔记 > 编程语言 > 正文

为什么使用预编译头(C/C++)?

如何解决《为什么使用预编译头(C/C++)?》经验,为你挑选了5个好方法。

快速提问 - 为什么要使用预编译标题?

编辑:阅读回复,我怀疑我一直在做的事情有点愚蠢:

#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 
#include 
#include 
#include 
#include 
#ifdef _DEBUG
#include 
#endif

// Standard Template Library
#include 
#include 
#include 
#include 
#include 
#include 
#include 

// Boost libraries
#include 
#include 
#include 

//Windows includes
#define WIN32_LEAN_AND_MEAN
#include 
#include "FILETIME_Comparisons.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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 
#include 

// 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"

Todd Gardner.. 56

在C/C++中,#include机制是指定到当前文件中的文件的文本副本.标题包括其他标题(其中包括其他标题),因此当你执行#include时,可能会在每个cpp文件(或cxx,c,无论如何)中添加数万行C++,所有这些都需要每次编译.这可能是大型项目的严重瓶颈.

预编译的头文件通过编译每个头文件一次加速,然后将编译状态包含在它们包含的cpp中.



1> Todd Gardner..:

在C/C++中,#include机制是指定到当前文件中的文件的文本副本.标题包括其他标题(其中包括其他标题),因此当你执行#include时,可能会在每个cpp文件(或cxx,c,无论如何)中添加数万行C++,所有这些都需要每次编译.这可能是大型项目的严重瓶颈.

预编译的头文件通过编译每个头文件一次加速,然后将编译状态包含在它们包含的cpp中.



2> rlbond..:

它编译得更快.没有它们,C++编译需要数年时间.尝试在大型项目中进行比较!



3> Daniel Earwi..:

Re:您当前的使用情况,如果您的目标文件数量非常大,那么以这种方式使用PCH可能会更快 - 尝试将其关闭以找出答案.这取决于:如果你有很多自己的标题,并且你很少更改它们,并且你有更多的源文件,你更频繁地更改,那么你的PCH使用将减少重建时间.

但正常的建议是只在PCH中放置永不改变的东西,因为生产PCH本身会有一定的开销.如果您在每次重建时触发关闭(通过不断调整其中一个标头),使用PCH可能会使重建速度变慢.



4> n8gray..:

因此,每次构建项目时都不必编译它们.它们用于不会改变的系统头.



5> swongu..:

它加快了编译速度.

当您包含其他项目的标题时,您不希望更改它们.如果将这些放入预编译的头文件中,那么在对源代码进行更改时,不必重新编译该代码.这减少了重复编译未更改的代码,加快了编译时间.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有