2009-05-24 38 views
28

Câu hỏi nhanh - Tại sao sử dụng các tiêu đề được biên dịch trước?Tại sao nên sử dụng các tiêu đề được biên dịch trước (C/C++)?

EDIT: Đọc các câu trả lời, tôi nghi ngờ những gì tôi đã làm với họ là ngu ngố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" 
+3

Một lưu ý quan trọng trên Visual Studio: đảm bảo #include đầu tiên trong mỗi tiêu đề là #include "stdafx.h" hoặc các tệp của bạn sẽ không được phân tích cú pháp! Ngu ngốc, tôi biết. Nhưng đó là một sai lầm dễ dàng để thực hiện. – rlbond

+2

Để cụ thể hơn, bất cứ thứ gì TRÊN #include "stdafx.h" không được phân tích cú pháp. Xem http://en.wikipedia.org/wiki/Precompiled_header – rlbond

Trả lời

34

Nó biên dịch LOT nhanh hơn. Biên dịch C++ mất nhiều năm mà không cần đến chúng. Hãy thử so sánh đôi khi trong một dự án lớn!

5

Vì vậy, bạn không cần phải biên dịch chúng mỗi khi bạn xây dựng dự án của bạn. Chúng được sử dụng cho các tiêu đề hệ thống sẽ không thay đổi.

+0

Vì vậy, (đọc chỉnh sửa ở trên) những gì bạn đang nói là tôi đã khá ngu ngốc ..... –

5

Nó tăng tốc độ biên dịch.

Khi bạn bao gồm tiêu đề từ các dự án khác, bạn không muốn thay đổi chúng. Nếu bạn đặt chúng vào một tiêu đề được biên dịch trước, thì mã đó sẽ không phải được biên dịch lại khi bạn thực hiện các thay đổi đối với mã nguồn của bạn. Điều này làm giảm biên dịch lặp đi lặp lại của mã không đổi, tăng tốc thời gian biên dịch.

25

Trong C/C++, cơ chế #include là bản sao văn bản của tệp được chỉ định trong tệp hiện tại. Tiêu đề bao gồm các tiêu đề khác (bao gồm các tiêu đề khác), vì vậy khi bạn thực hiện #include, nó có thể thêm hàng chục nghìn dòng C++ vào mỗi tệp cpp (hoặc cxx, c, bất kỳ), tất cả đều cần phải được biên dịch mỗi lần. Đây có thể là một nút cổ chai cho các dự án lớn.

tiêu đề biên dịch sẵn tốc độ này lên bằng cách biên dịch mỗi tiêu đề một lần, sau đó trong đó có biên soạn nhà nước vào cpp họ có trong

+0

Tôi đã nhìn vào một cái nhìn sâu sắc những gì thực sự là một biên dịch sẵn tiêu đề là nguyên nhân vì chúng tôi biết các tệp tiêu đề không phải là đơn vị dịch. Lời giải thích hay, thx. – macroland

9

Re:. Sử dụng hiện tại của bạn, nếu bạn có một mục tiêu với một số lượng rất lớn các tập tin , vẫn có thể sử dụng PCH nhanh hơn theo cách đó - hãy thử tắt chúng đi để tìm hiểu. Nó phụ thuộc: nếu bạn có nhiều tiêu đề của riêng bạn và bạn chỉ thay đổi chúng thường xuyên và bạn có một số lượng lớn tệp nguồn mà bạn thay đổi thường xuyên hơn, thì việc sử dụng PCH của bạn sẽ giảm thời gian xây dựng lại.

Nhưng lời khuyên thông thường là chỉ đặt những thứ trong PCH mà không bao giờ thay đổi, bởi vì có một chi phí nào đó để sản xuất PCH. Nếu bạn kích hoạt nó với mỗi lần xây dựng lại (bằng cách liên tục tinh chỉnh một trong các tiêu đề của bạn), bằng cách sử dụng PCH có thể làm cho việc xây dựng lại chậm hơn.

+0

Những tệp đó thay đổi khá nhiều mỗi bản dựng: P –

Các vấn đề liên quan