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 时到达的位置。
我一直在使用链式预编译头文件 (.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 时到达的位置。