2009-05-24 14 views
28

Hızlı soru - Neden Önceden Tanımlanmış Başlıklar kullanmalı?Neden Önceden Tanımlanmış Üstbilgileri (C/C++) Kullanılsın?

DÜZENLEME: yanıtları Okuma , ne onlarla yapıyorum biraz aptalca şüpheli:

#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'daki önemli bir not: her başlıktaki ilk #include öğesinin #include "stdafx.h" olduğundan emin olun veya dosyalarınız ayrıştırılmayacaktır! Aptal, biliyorum. Ama yapmak kolay bir hatadır. – rlbond

+2

Daha spesifik olmak gerekirse, herhangi bir ABOVE #include "stdafx.h" ayrıştırılmaz. Bkz. Http://en.wikipedia.org/wiki/Precompiled_header – rlbond

cevap

34

Daha hızlı bir LOT derler. C++ derleme onlarsız yıllar alır. Büyük bir projede bazen karşılaştırmayı deneyin!

5

Demek onlara Projenizi oluşturmak her zaman derlemek gerekmez. Değişmeyecek sistem başlıklarında kullanılırlar.

+0

Yani (yukarıdaki okumaya devam edin) söylediklerim oldukça aptalca olduğumdur ..... –

5

Derlemeyi hızlandırır.

Diğer projelerin başlıklarını eklerken, bunları değiştirmeyi beklemezsiniz. Bunları önceden derlenmiş bir başlığa eklerseniz, kaynak kodunuzda değişiklik yaptığınızda bu kodun yeniden derlenmesi gerekmez. Bu, değişmeyen kodun tekrarlanan derlemesini azaltır, derleme süresini hızlandırır.

25

C/C++ 'da, #include mekanizması geçerli dosyaya belirtilen dosyanın metinsel bir kopyasıdır. Üstbilgiler diğer başlıkları içerir (diğer başlıkları içerir), böylece bir #include yaptığınızda, her bir cpp dosyasına (veya cxx, c, neyse), on binlerce satırlık C++ ekleyebilir. her seferinde derlenmiş. Bu büyük projeler için ciddi bir darboğaz olabilir.

derlenmiş başlıklar bunlar dahildir cpp'de içine devlet derlenmiş da dahil olmak üzere, daha sonra bir kez her başlık derleyerek bu hızlandırmak

+0

Gerçekten önceden derlenmiş bir içgörüyü araştırıyordum. Üstbilginin nedeni, başlık dosyalarının kendileri tarafından çeviri birimi olmadığını biliyoruz. Güzel bir açıklama, thx. – macroland

9

Re:. Mevcut kullanımı, dosyaların çok büyük bir sayı ile bir hedef varsa PCH'yi bu şekilde kullanmak daha hızlı olabilir - öğrenmek için bunları kapatmayı deneyin. Şuna bağlıdır: eğer kendi başınıza çok fazla başlık varsa ve bunları çok seyrek olarak değiştirirseniz ve çok daha sık değiştirdiğiniz çok sayıda kaynak dosyanız varsa, PCH kullanımınız yeniden oluşturma sürelerini kısaltır.

Fakat normal tavsiye, hiçbir zaman PCH'ye hiçbir şey değişmeyecek, çünkü PCH'nin kendisini üretmek için belirli bir yük vardır. Bunu her yeniden oluşturmayla tetiklerseniz (üstbilgilerinizden birini sürekli olarak değiştirerek), PCH'yi kullanarak yeniden oluşturma işlemini yavaşlatabilirsiniz.

+0

Bu dosyalar hemen hemen her yapıya göre değişir: P –

İlgili konular