Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why use precompiled headers (C/C++)?

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" 
like image 267
Billy ONeal Avatar asked May 24 '09 06:05

Billy ONeal


People also ask

What is the purpose of a precompiled header?

You can precompile both C and C++ programs. In C++ programming, it's common practice to separate class interface information into header files. These header files can later be included in programs that use the class. By precompiling these headers, you can reduce the time a program takes to compile.

Are precompiled headers worth it?

The advantage of precompiled headers is that the huge system library header files and other files that do not change at all or infrequently only have to be parsed once per build. As all C compilers (that I know of) work on every .

Why do we use header files in C?

Header files serve two purposes. System header files declare the interfaces to parts of the operating system. You include them in your program to supply the definitions and declarations you need to invoke system calls and libraries.


2 Answers

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 severe bottleneck for large projects.

Precompiled headers speed this up by compiling each header once, then including that compiled state into the cpp they are included in.

like image 112
Todd Gardner Avatar answered Oct 14 '22 00:10

Todd Gardner


It compiles a lot quicker. C++ compilation takes years without them. Try comparing some time in a large project!

like image 26
rlbond Avatar answered Oct 13 '22 23:10

rlbond