5

编译器在编译源(例如*.cpp)文件时,它会创建目标文件(例如*.o),以便稍后将它链接到其他.o.so.libWindows 的文件)文件并构成可执行文件。

现在对于每次创建一些.pch 文件时不编译头文件的类比情况,以便随后由链接器链接它。

现在,如果在 Visula Studio 项目的范围内定义了预编译的头文件,那么为什么 Visual Studio 会报错(例如**fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?**)头文件未包含在 .cpp 文件中。

通过总结,这是我的问题:

  1. 为什么在每个 .cpp 文件中都需要项目的预编译头文件?
  2. 每个编译单元中存在预编译头的要求如何优化编译过程?换句话说,这个要求有什么好处?(可能由用户决定在哪里包含,在哪里不包含!)
  3. 如果预编译的头文件包含在一个.cpp文件中,它只使用了.pch文件中的2%,那么剩余的98%将添加到相应的.o文件中吗?
4

3 回答 3

11

为什么在每个 .cpp 文件中都需要项目的预编译头文件?

因为你要求的。如果您不想使用它,则需要更改 .cpp 文件的选项。右键单击它,属性,C/C++,预编译头文件,“创建/使用”=“不使用预编译头文件”。默认设置为“使用”。这样做没有什么意义。

每个编译单元中的预编译头如何优化编译过程?

通过不必解析#includes。当你特别有用#include <windows.h>。在包含数百个 .cpp 文件的大型项目中,节省的时间以秒为单位,加起来长达几分钟。这是迄今为止在不损失生成代码质量的情况下加速编译器的最便宜的方法。

那么剩下的98%会被添加到对应的.o文件中去吗?

当然不是。

于 2012-09-19T10:14:38.413 回答
4
  1. It's not actually necessary to include the precompiled header in every compilation unit. You can set the "not using precompiled header" setting for a single file in the C/C++->Precompiled Headers properties section for that file. This is a lot of work though, and I've never known anyone to do it in production code.
  2. The optimization is that the precompiled header is built just once and the whole shebang is reused for all compilation units without recompiling / re-including (sort of). If you have a set of files that are included a lot of times this can save much compilation time. See The Care And Feeding of Precompiled Headers too.
  3. No, you don't get superfluous file contents, just like you don't when static-linking.
于 2012-09-19T10:12:10.033 回答
2
  1. 我猜你的问题是“为什么编译器不能假设这个头文件总是存在的,如果它是强制性的”。原因是VS不想这么偏离标准。如果您的 .cpp 文件正在使用头文件中的某些内容,则它必须包含它。这样,即使您关闭预编译头文件,您的文件也将完全一样地编译(只是需要更长的时间)。
  2. 正如其他人所说,如果需要,您可以显式禁用单个文件的预编译头文件。这个想法是你应该只在预编译的头文件中包含你在大多数文件中使用的那些元素,如果不是所有文件的话。
  3. 不,无论是否预编译了标头,生成的目标代码都应该是相同的。
于 2012-09-19T10:22:52.900 回答