Apparently it is recommended to force include precompiled headers, so that the source may be used with and without precompiled headers. Even CMake uses the force include method on precompiled headers.
However for example Microsofts MSVC documentation says:
The compiler treats all code occurring before the .h file as precompiled. It skips to just beyond the #include directive associated with the .h file, uses the code contained in the .pch file, and then compiles all code after filename.
and for the /FI
option the documentation says:
This option has the same effect as specifying the file with double quotation marks in an #include directive on the first line of every source file specified on the command line, in the CL environment variable, or in a command file.
So to summarize this: All includes that are above/before an include directive of a corresponding precompiled header, will be precompiled into the PCH file. Force-including that file will put this in the first line of a file.
My question now is: How does this work together? Is there some special logic for PCH files during build process or am I missing something?
Update: I checked the gcc documentation as well and it looks like that gcc searches for precompiled headers for each include directive it finds and uses precompiled headers if possible. So do I understand it correctly that MSVC kind of summarizes all includes before (including the header itself) an include that should be used to generate a precompiled header, where gcc instead generates a precompiled header for that specific header?
If that's right it arises the question: Is gcc really way more flexible regarding preocmpiled header usage and how easy it is to gain a performance boost during compilation out of it?