2009-05-24 16 views
28

簡単な質問 - なぜプリコンパイル済みヘッダーを使用するのですか?プリコンパイル済みヘッダー(C/C++)を使用する理由

EDIT: が回答を読んで、私は彼らと一緒に行ってきたことはちょっとばかげているものを疑う:

#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" 
+3

Visual Studioの重要な注意点:各ヘッダーの最初の#includeが#include "stdafx.h"であることを確認してください。そうしないと、ファイルが解析されません。愚か、私は知っている。しかし、それは簡単な間違いです。 – rlbond

+2

より具体的には、ABOVE #include "stdafx.h"は解析されません。 http://en.wikipedia.org/wiki/Precompiled_headerを参照してください – rlbond

答えて

34

これは、より速くコンパイルします。 C++のコンパイルには何年もかかりません。大きなプロジェクトでいつか比較しよう!

5

だから、あなたがそれらをあなたのプロジェクトをビルドするたびにコンパイルする必要はありません。それらは変更されないシステムヘッダーに使用されます。

+0

あなたが言っていることは、私がかなりばかげているということです(上記の編集を参照)。 –

5

コンパイルが高速になります。

他のプロジェクトのヘッダーを含める場合は、変更する予定はありません。これらをプリコンパイル済みのヘッダーに入れると、ソースコードに変更を加えたときにそのコードを再コンパイルする必要はありません。これにより、変更されていないコードの反復コンパイルが削減され、コンパイル時間が短縮されます。

25

C/C++では、#includeメカニズムは、現在のファイルに指定されたファイルのテキスト形式のコピーです。ヘッダーには他のヘッダー(まだ他のヘッダーを含む)が含まれているので、#includeを実行すると、各cppファイル(またはcxx、cなど)に何万行ものC++が追加される可能性があります。毎回コンパイルされる。これは、大規模なプロジェクトでは邪魔になることがあります。

プリコンパイル済みヘッダーには、それらが含まれているCPPに状態をコンパイルすることを含めて、その後、一度各ヘッダをコンパイルして、これをスピードアップ

+0

実際にはコンパイルされたものヘッダーファイルは翻訳単位ではありません。いい説明、thx。 – macroland

9

再:あなたの現在の使用状況、あなたは非常に多数のファイルをターゲットにしている場合そのようにしてPCHを使用する方が速いかもしれません - 調べるためにそれらを切ってみてください。これは依存しています:あなた自身のヘッダーがたくさんあり、頻繁に変更するだけでなく、頻繁に変更するソースファイルが非常に多い場合、PCHの使用は再構築時間を短縮します。

しかし、通常のアドバイスは、PCH自体を作成するには一定のオーバーヘッドがあるため、決して変更されないものをPCHに入れることです。再構築するたびに(ヘッダーの1つを常に調整して)これを起動すると、PCHを使用すると再構築が遅くなる可能性があります。

+0

これらのファイルはすべてのビルドがかなり変更されます:P –

関連する問題