当编译器编译源文件(例如
*.cpp
)文件时,它会创建目标文件(例如*.o
),以便稍后它将链接到其他.o
和.so
(对于Windows为.lib
文件)文件和将构成可执行文件。
现在,对于类似的情况,每次创建一些 .pch 文件时不编译头文件,以便链接器随后将其链接。
现在,如果在 Visula Studio 项目的范围内定义了预编译头,那么为什么 Visual Studio 会抱怨头文件未包含在 .cpp 文件中的错误(例如
**fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?**
)。
总结一下,我的问题如下:
为什么每个.cpp文件中都需要项目的预编译头?
因为是你要求的。 如果您不想使用它,则需要更改 .cpp 文件的选项。 右键单击它,属性,C/C++,预编译头,“创建/使用”=“不使用预编译头”。 默认设置为“使用”。 这样做没有什么意义。
各个编译单元中的预编译头是如何优化编译过程的?
无需解析#includes。 当您
#include <windows.h>
时特别有用。 在包含数百个 .cpp 文件的大型项目中,节省的时间约为数秒,总计可达数分钟。 这是迄今为止加速编译器最便宜的方法,并且不会降低生成代码的质量。
那么剩下的98%会被添加到相应的.o文件中去吗?
当然不是。