跳至正文

Hazel视频笔记 —— 预编译头文件

视频内容

刚开始我以为up就是想把所有的系统级头文件合并在一个.h里然后引用,还在想这有什么意义,好看一点?

看到改CMake直接使用了一个pchheader才知道,这里有东西的!!

预编译的头文件

PCH文件是一个预编译头文件(pre-compiled header),它的后缀是PCH,所以也叫PCH文件。编译器会将头文件的内容事先编译成二进制的中间文件,在整个编译过程中,只编译一次,并且有缓存,除非有变化,否则不会重新编译(每个引入的.h和.cpp)文件,从而大大提高编译速度。

每个源文件只能使用一个预编译的标头(.pch)文件,但是可以在一个项目中使用多个.pch文件。

几乎所有C/C++编译器都支持预编译头文件的,例如gcc, clang, msvc等…但是不同的编译器对它的支持力度和处理方式有很大差异,并不是非常通用。

msvc的处理

/Yc是创建pch文件,必须要通过编译stdafx.cpp才能生成stdafx.pch,使用的时候需要用/Yu来使用,最后链接的时候还需要把stdafx.obj和test.obj都链接上才行,这也是和gcc, clang最大的不同。

其他

clang的支持很简单,可以直接通过-c创建,使用的时候通过-include-pch直接使用。

gcc不支持-include-pch,所以需要从-I的头文件路径中搜索。

标头单元、模块和预编译头文件

微软的文档里所描述的,include是最慢的,其次是预编译头,再快一点的是标头单元,而最快的是模块。

import std或者import std.compat的速度比#include <vector>要快,不过目前好像只有msvc支持完整,clang到17还是部分支持。

那说回来,什么是标头单元?
标头单元是头文件的二进制表示形式。 标头单元以 .ifc 扩展名结尾。相同的格式也用于命名模块。
使用标头单元比include编译要快的主要原因就是标头单元类似于预编译头文件一样,是提前被编译过的,而且标头单元是不受外部宏定义影响的,因为已经被编译过了。

不过标准库的标头文件,现在看支持好像还是一般,以mvsc为主。

参考

https://tboox.org/cn/2017/07/31/precompiled-header/
https://learn.microsoft.com/zh-cn/cpp/build/compare-inclusion-methods?view=msvc-170

End。

目录