pch 可以显示引用文本源的警告吗?

Can a pch show warnings referencing the textual source?

我一直在使用链式预编译头文件 (.pch) 编译 C++ 项目。 我在 Linux 平台上使用 Clang 编译器,带有一些警告标志,例如:-pedantic、-Wall。

现在,在编译 .pch 时,根本没有显示任何警告,但是,在编译我的主要源代码 (.cpp) 时,一些警告会记录到终端,显示文本源中的实际位置。

(为澄清起见,警告来自原始 .pch 源)

我可以只禁用警告,但有一点让我感到困惑:如果 .pch 是二进制文件,编译器如何将文本记录到终端? 我在想编译器以某种方式使用文本源,而不是根本不使用 .pch。

有谁知道任何可以反驳我的推定的事情吗?

如果有帮助的话,我的 makefile 是这样粗略布局的:

foo = ./somewhere/foo
bar = ./somewhere/bar
main ./main.cpp
output_file = ./app

flags = -pthread -Wall -pedantic -std=c++2a -O2

$(output_file): $(main) $(foo).pch
    clang++ \
        $(flags) \
        -include-pch $(foo).pch \
        -fsanitize=$(sanitize) \
        $(main) \
        -o $(output_file)

$(foo).pch: $(foo).hpp $(bar).pch
    clang++ $(flags) -include-pch $(bar).pch -x c++-header $(foo).hpp -o $(foo).pch

$(bar).pch: $(bar).hpp
    clang++ $(flags) -x c++-header $(bar).hpp -o $(bar).pch

PCH 并不意味着它已编译,它只是“预编译”,这只是一个奇特的名称,表示“它是当前解析器状态的转储”。

意味着已经进行了预处理(包括,ifdefs和宏都没有了),并且代码被切割成token,但还没有进行实际的翻译工作。

所有这些,包括除了基本语法错误之外的任何可能产生警告的东西,只会在编译开始时发生。

只有在词法分析器恢复工作后才会发生这种情况,方法是将主源文件作为附加输入提供,继续创建 PCH 时到达的位置。