在阅读了这篇精彩的文章(预编译标题的关注和喂养)之后,我对这些文章在现实生活中如何实际起作用存在疑问.更具体地说,我怎么知道在以下场景中我需要触发预编译头的重建:
#define在我的一个.cpp文件中改变预处理器解释已经包含在我的预编译头中的一些头的方式#define是特定的预处理器指令,它改变了预处理器解释已经包含在预编译头中的标头的方式#include其他标头时,前一个问题可以递归发生是否应该使用预编译的头文件强制执行某种限制性编码样式,例如将.cpp文件中包含的头文件数限制为一个并且永远不会将#define内容限制在.cpp文件中?
虽然微软的编译器可能在预先编译的头文件中做了不错的工作(通过应用一些特定于MS的voodoo),因为据我所知,它提供了应该做所有管道的选项/Yc和/Yu选项,对于GCC来说,似乎这个功能需要Makefile中的大量手动工作和创造力,我无法找到应该解决使用预编译头文件的所有陷阱的模板.
例如,如果我有一个构建多个库的项目,为了在每次更改后不重建所有库,我必须在Makefile中使用一些非常可爱的sed技巧来检测#include当前库中的一个头文件是否被修改(或者它#include是一个修改过的标题).我担心甚至会想到预先构建的头文件实际上意味着的复杂性,以便构建脚本在每次必要时重建它们.
我有头文件header.h:
#define TEST_VALUE 1
#define TEST_STRING "hello world"
Run Code Online (Sandbox Code Playgroud)
和源文件source.cpp:
#include "header.h"
#include "stdio.h"
int main() {
printf(TEST_STRING"\n");
}
Run Code Online (Sandbox Code Playgroud)
我跟着clang pch文章并表演了:
MBA-Anton:pch asmirnov$ clang -cc1 ./header.h -emit-pch -o ./header.pch
MBA-Anton:pch asmirnov$ clang -cc1 -include-pch header.pch source.cpp -o source
error: C99 was enabled in PCH file but is currently disabled
1 error generated.
MBA-Anton:pch asmirnov$ clang -I. source.cpp -o source
MBA-Anton:pch asmirnov$ ls
header.h header.pch source source.cpp
MBA-Anton:pch asmirnov$ ./source
hello world
Run Code Online (Sandbox Code Playgroud)
所以我无法与PCH链接,但我可以编译/链接源+标头.与clang文章的例子的唯一区别是我已经尝试过c ++并且它是针对c描述的.所以我试着指定c ++语言:
MBA-Anton:pch asmirnov$ clang -cc1 ./header.h …Run Code Online (Sandbox Code Playgroud)