fbpx
Wikipedia

Precompiled header

In computer programming, a precompiled header (PCH) is a (C or C++) header file that is compiled into an intermediate form that is faster to process for the compiler. Usage of precompiled headers may significantly reduce compilation time, especially when applied to large header files, header files that include many other header files, or header files that are included in many translation units.

Rationale edit

In the C and C++ programming languages, a header file is a file whose text may be automatically included in another source file by the C preprocessor by the use of a preprocessor directive in the source file.

Header files can sometimes contain very large amounts of source code (for instance, the header files windows.h and Cocoa/Cocoa.h on Microsoft Windows and OS X, respectively). This is especially true with the advent of large "header" libraries that make extensive use of templates, like the Eigen math library and Boost C++ libraries. They are written almost entirely as header files that the user #includes, rather than being linked at runtime. Thus, each time the user compiles their program, the user is essentially recompiling numerous header libraries as well. (These would be precompiled into shared objects or dynamic link libraries in non "header" libraries.)

To reduce compilation times, some compilers allow header files to be compiled into a form that is faster for the compiler to process. This intermediate form is known as a precompiled header, and is commonly held in a file named with the extension .pch or similar, such as .gch under the GNU Compiler Collection.

Usage edit

For example, given a C++ file source.cpp that includes header.hpp:

//header.hpp ... 
//source.cpp #include "header.hpp" ... 

When compiling source.cpp for the first time with the precompiled header feature turned on, the compiler will generate a precompiled header, header.pch. The next time, if the timestamp of this header did not change, the compiler can skip the compilation phase relating to header.hpp and instead use header.pch directly.

Common implementations edit

Microsoft Visual C and C++ edit

Microsoft Visual C++ (version 6.0 and newer[citation needed]) can precompile any code, not just headers.[1] It can do this in two ways: either precompiling all code up to a file whose name matches the /Ycfilename option or (when /Yc is specified without any filename) precompiling all code up to the first occurrence of #pragma hdrstop in the code[2][3] The precompiled output is saved in a file named after the filename given to the /Yc option, with a .pch extension, or in a file named according to the name supplied by the /Fpfilename option.[3] The /Yu option, subordinate to the /Yc option if used together, causes the compiler to make use of already precompiled code from such a file.[3]

pch.h (named stdafx.h before Visual Studio 2017[4]) is a file generated by the Microsoft Visual Studio IDE wizard, that describes both standard system and project specific include files that are used frequently but hardly ever change.

The afx in stdafx.h stands for application framework extensions. AFX was the original abbreviation for the Microsoft Foundation Classes (MFC). While the name stdafx.h was used by default in MSVC projects prior to version 2017, any alternative name may be manually specified.

Compatible compilers will precompile this file to reduce overall compile times. Visual C++ will not compile anything before the #include "pch.h" in the source file, unless the compile option /Yu'pch.h' is unchecked (by default); it assumes all code in the source up to and including that line is already compiled.

GCC edit

Precompiled headers are supported in GCC (3.4 and newer). GCC's approach is similar to these of VC and compatible compilers. GCC saves precompiled versions of header files using a ".gch" suffix. When compiling a source file, the compiler checks whether this file is present in the same directory and uses it if possible.

GCC can only use the precompiled version if the same compiler switches are set as when the header was compiled and it may use at most one. Further, only preprocessor instructions may be placed before the precompiled header (because it must be directly or indirectly included through another normal header, before any compilable code).

GCC automatically identifies most header files by their extension. However, if this fails (e.g. because of non-standard header extensions), the -x switch can be used to ensure that GCC treats the file as a header.

clang edit

The clang compiler added support for PCH in Clang 2.5 / LLVM 2.5 of 2009.[5] The compiler both tokenizes the input source code and performs syntactic and semantic analyses of headers, writing out the compiler's internal generated abstract syntax tree (AST) and symbol table to a precompiled header file.[6]

clang's precompiled header scheme, with some improvements such as the ability for one precompiled header to reference another, internally used, precompiled header, also forms the basis for its modules mechanism.[6] It uses the same bitcode file format that is employed by LLVM, encapsulated in clang-specific sections within Common Object File Format or Extensible Linking Format files.[6]

C++Builder edit

In the default project configuration, the C++Builder compiler implicitly generates precompiled headers for all headers included by a source module until the line #pragma hdrstop is found.[7]: 76  Precompiled headers are shared for all modules of the project if possible. For example, when working with the Visual Component Library, it is common to include the vcl.h header first which contains most of the commonly used VCL header files. Thus, the precompiled header can be shared across all project modules, which dramatically reduces the build times.

In addition, C++Builder can be instrumented to use a specific header file as precompiled header, similar to the mechanism provided by Visual C++.

C++Builder 2009 introduces a "Precompiled Header Wizard" which parses all source modules of the project for included header files, classifies them (i.e. excludes header files if they are part of the project or do not have an Include guard) and generates and tests a precompiled header for the specified files automatically.

Pretokenized header edit

A pretokenized header (PTH) is a header file stored in a form that has been run through lexical analysis, but no semantic operations have been done on it. PTH is present in Clang before it supported PCH, and has also been tried in a branch of GCC.[8]

Compared to a full PCH mechanism, PTH has the advantages of language (and dialect) independence, as lexical analysis is similar for the C-family languages, and architecture independence, as the same stream of tokens can be used when compiling for different target architectures.[9] It however has the disadvantage of not going any further than simple lexical analysis, requiring that syntactic and semantic analysis of the token stream be performed with every compilation. In addition, the time to compile scaling linearly with the size, in lexical tokens, of the pretokenized file, which is not necessarily the case for a fully-fledged precompilation mechanism (PCH in clang allows random access).[9]

Clang's pretokenization mechanism includes several minor mechanisms for assisting the pre-processor: caching of file existence and datestamp information, and recording inclusion guards so that guarded code can be quickly skipped over.[9]

See also edit

References edit

  1. ^ . MSDN. Microsoft. 2015. Archived from the original on 2018-03-28. Retrieved 2018-03-28.
  2. ^ "Two Choices for Precompiling Code". MSDN. Microsoft. 2015. Retrieved 2018-03-28.
  3. ^ a b c "/Yc (Create Precompiled Header File)". MSDN. Microsoft. 2015. Retrieved 2018-03-28.
  4. ^ "Can I use #include "pch.h" instead of #include "stdafx.h" as my precompile header in Visual Studio C++?". Stack Overflow.
  5. ^ "LLVM 2.5 Release Notes". releases.llvm.org.
  6. ^ a b c The Clang Team (2018). "Precompiled Header and Modules Internals". Clang 7 documentation. Retrieved 2018-03-28.
  7. ^ Swart, Bob (2003). Borland C++ Builder 6 Developer's Guide. Sams Publishing. ISBN 9780672324802.
  8. ^ "pph - GCC Wiki". gcc.gnu.org.
  9. ^ a b c The Clang Team (2018). . Clang 7 documentation. Archived from the original on 2018-03-22. Retrieved 2018-03-28.

External links edit

  • The Care and Feeding of Pre-Compiled Headers
  • Precompiled Headers with GCC
  • Fractal eXtreme: Precompiled headers

precompiled, header, this, article, multiple, issues, please, help, improve, discuss, these, issues, talk, page, learn, when, remove, these, template, messages, this, article, lead, section, short, adequately, summarize, points, please, consider, expanding, le. This article has multiple issues Please help improve it or discuss these issues on the talk page Learn how and when to remove these template messages This article s lead section may be too short to adequately summarize the key points Please consider expanding the lead to provide an accessible overview of all important aspects of the article December 2012 This article needs additional citations for verification Please help improve this article by adding citations to reliable sources Unsourced material may be challenged and removed Find sources Precompiled header news newspapers books scholar JSTOR May 2018 Learn how and when to remove this template message Learn how and when to remove this template message In computer programming a precompiled header PCH is a C or C header file that is compiled into an intermediate form that is faster to process for the compiler Usage of precompiled headers may significantly reduce compilation time especially when applied to large header files header files that include many other header files or header files that are included in many translation units Contents 1 Rationale 2 Usage 3 Common implementations 3 1 Microsoft Visual C and C 3 2 GCC 3 3 clang 3 4 C Builder 4 Pretokenized header 5 See also 6 References 7 External linksRationale editIn the C and C programming languages a header file is a file whose text may be automatically included in another source file by the C preprocessor by the use of a preprocessor directive in the source file Header files can sometimes contain very large amounts of source code for instance the header files windows h and Cocoa Cocoa h on Microsoft Windows and OS X respectively This is especially true with the advent of large header libraries that make extensive use of templates like the Eigen math library and Boost C libraries They are written almost entirely as header files that the user includes rather than being linked at runtime Thus each time the user compiles their program the user is essentially recompiling numerous header libraries as well These would be precompiled into shared objects or dynamic link libraries in non header libraries To reduce compilation times some compilers allow header files to be compiled into a form that is faster for the compiler to process This intermediate form is known as a precompiled header and is commonly held in a file named with the extension pch or similar such as gch under the GNU Compiler Collection Usage editFor example given a C file source cpp that includes header hpp header hpp source cpp include header hpp When compiling source cpp for the first time with the precompiled header feature turned on the compiler will generate a precompiled header header pch The next time if the timestamp of this header did not change the compiler can skip the compilation phase relating to header hpp and instead use header pch directly Common implementations editMicrosoft Visual C and C edit Microsoft Visual C version 6 0 and newer citation needed can precompile any code not just headers 1 It can do this in two ways either precompiling all code up to a file whose name matches the Yc i filename i option or when Yc is specified without any i filename i precompiling all code up to the first occurrence of pragma hdrstop in the code 2 3 The precompiled output is saved in a file named after the i filename i given to the Yc option with a pch extension or in a file named according to the name supplied by the Fp i filename i option 3 The Yu option subordinate to the Yc option if used together causes the compiler to make use of already precompiled code from such a file 3 pch h named stdafx h before Visual Studio 2017 4 is a file generated by the Microsoft Visual Studio IDE wizard that describes both standard system and project specific include files that are used frequently but hardly ever change The afx in stdafx h stands for application framework extensions AFX was the original abbreviation for the Microsoft Foundation Classes MFC While the name stdafx h was used by default in MSVC projects prior to version 2017 any alternative name may be manually specified Compatible compilers will precompile this file to reduce overall compile times Visual C will not compile anything before the include pch h in the source file unless the compile option Yu pch h is unchecked by default it assumes all code in the source up to and including that line is already compiled GCC edit Precompiled headers are supported in GCC 3 4 and newer GCC s approach is similar to these of VC and compatible compilers GCC saves precompiled versions of header files using a gch suffix When compiling a source file the compiler checks whether this file is present in the same directory and uses it if possible GCC can only use the precompiled version if the same compiler switches are set as when the header was compiled and it may use at most one Further only preprocessor instructions may be placed before the precompiled header because it must be directly or indirectly included through another normal header before any compilable code GCC automatically identifies most header files by their extension However if this fails e g because of non standard header extensions the x switch can be used to ensure that GCC treats the file as a header clang edit The clang compiler added support for PCH in Clang 2 5 LLVM 2 5 of 2009 5 The compiler both tokenizes the input source code and performs syntactic and semantic analyses of headers writing out the compiler s internal generated abstract syntax tree AST and symbol table to a precompiled header file 6 clang s precompiled header scheme with some improvements such as the ability for one precompiled header to reference another internally used precompiled header also forms the basis for its modules mechanism 6 It uses the same bitcode file format that is employed by LLVM encapsulated in clang specific sections within Common Object File Format or Extensible Linking Format files 6 C Builder edit In the default project configuration the C Builder compiler implicitly generates precompiled headers for all headers included by a source module until the line pragma hdrstop is found 7 76 Precompiled headers are shared for all modules of the project if possible For example when working with the Visual Component Library it is common to include the vcl h header first which contains most of the commonly used VCL header files Thus the precompiled header can be shared across all project modules which dramatically reduces the build times In addition C Builder can be instrumented to use a specific header file as precompiled header similar to the mechanism provided by Visual C C Builder 2009 introduces a Precompiled Header Wizard which parses all source modules of the project for included header files classifies them i e excludes header files if they are part of the project or do not have an Include guard and generates and tests a precompiled header for the specified files automatically Pretokenized header editA pretokenized header PTH is a header file stored in a form that has been run through lexical analysis but no semantic operations have been done on it PTH is present in Clang before it supported PCH and has also been tried in a branch of GCC 8 Compared to a full PCH mechanism PTH has the advantages of language and dialect independence as lexical analysis is similar for the C family languages and architecture independence as the same stream of tokens can be used when compiling for different target architectures 9 It however has the disadvantage of not going any further than simple lexical analysis requiring that syntactic and semantic analysis of the token stream be performed with every compilation In addition the time to compile scaling linearly with the size in lexical tokens of the pretokenized file which is not necessarily the case for a fully fledged precompilation mechanism PCH in clang allows random access 9 Clang s pretokenization mechanism includes several minor mechanisms for assisting the pre processor caching of file existence and datestamp information and recording inclusion guards so that guarded code can be quickly skipped over 9 See also editPrefix header Single compilation unitReferences edit Creating Precompiled Header Files MSDN Microsoft 2015 Archived from the original on 2018 03 28 Retrieved 2018 03 28 Two Choices for Precompiling Code MSDN Microsoft 2015 Retrieved 2018 03 28 a b c Yc Create Precompiled Header File MSDN Microsoft 2015 Retrieved 2018 03 28 Can I use include pch h instead of include stdafx h as my precompile header in Visual Studio C Stack Overflow LLVM 2 5 Release Notes releases llvm org a b c The Clang Team 2018 Precompiled Header and Modules Internals Clang 7 documentation Retrieved 2018 03 28 Swart Bob 2003 Borland C Builder 6 Developer s Guide Sams Publishing ISBN 9780672324802 pph GCC Wiki gcc gnu org a b c The Clang Team 2018 Pretokenized Headers PTH Clang 7 documentation Archived from the original on 2018 03 22 Retrieved 2018 03 28 External links editThe Care and Feeding of Pre Compiled Headers Precompiled Headers with GCC Fractal eXtreme Precompiled headers Retrieved from https en wikipedia org w index php title Precompiled header amp oldid 1166267881, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.