预编译头和预编译二进制文件之间的区别是什么

时间:2017-01-11 06:55:00

标签: c++

Wiki引用提到某些标题有时可能包含大量源代码,因此将它们作为预编译标题将节省编译时间。 https://en.wikipedia.org/wiki/Precompiled_header

如果预编译头可以包含已编译的源代码,那么它与预编译的二进制文件有什么不同。

2 个答案:

答案 0 :(得分:4)

C ++定义了"翻译单元"的概念。翻译单元是翻译开始的锚点,并且程序通常包括若干这样的翻译单元。哪些单元作为"转换单元传递给编译器"实际上取决于IDE,makefile和其他配置中的设置。但非正式地,大多数配置会将您的.cpp.c文件作为翻译单元。

为了使其更容易,我们可以将翻译单元视为编译器生成二进制文件的内容,然后链接器将多个二进制文件组合到一个程序中。

因此,头文件通常不会被配置为翻译单元,并且它们通常不会自己生成二进制文件,即使它们包含源代码也是如此。他们被认为是从翻译单位导入的,并将与他们一起编译。

如果这样的头文件包含许多源代码,这些源代码将包含在几个翻译单元中,那么(预)编译它们一次并在中间结果中保留尽可能多的信息是有意义的,这样编译实际的翻译单元更快。这节省了时间,但是"中间二进制"是内在的,没有暴露的。

但是,根据其中的源代码的内容和类型,头文件与其他源代码文件无法区分。您可以传递一个"头文件"将编译器作为翻译单元,编译器实际上会生成一个" normal"二进制出来的。实际上,它们通常不会被声明为编译的根目录。

希望有所帮助。

答案 1 :(得分:1)

与编译源相比,主要区别在于预编译头中存储的信息越多。 如果您将源代码编译为二进制信息,那么定义和模板就会丢失。定义为其值而消失,模板仅以实例化形式获取到二进制文件。如果预编译头部包含在某处,则预编译头将保留有关模板的通用形式以及定义的名称和值的信息。 对于纯源预编译头与编译源相同。