Visual Studio强制在项目的所有编译单元中包含预编译的头文件?

时间:2012-09-19 10:03:34

标签: c++ visual-studio-2008 compiler-construction linker precompiled-headers

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

现在针对类似的情况,每次创建一些.pch files时都不编译头文件,以便链接器将它链接起来。

现在,如果在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文件中。< / p>

总结一下,这是我的问题:

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

3 个答案:

答案 0 :(得分:9)

  

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

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

  

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

不必解析#includes。 #include <windows.h>时特别有用。在具有数百个.cpp文件的大型项目中,节省的时间大约为秒,这些文件可累计达数分钟。到目前为止,它是加速编译器的最便宜的方式,不会降低生成代码的质量。

  

然后将剩余的98%添加到相应的.o文件中?

当然不是。

答案 1 :(得分:3)

  1. 实际上并不需要在每个编译单元中包含预编译的头文件。您可以在该文件的C / C ++ - &gt;预编译标题属性部分中为单个文件设置“不使用预编译标题”设置。这是很多工作,我从来不知道有人在生产代码中这样做。
  2. 优化是预编译头只构建一次,整个shebang重用于所有编译单元而无需重新编译/重新包含(排序)。如果你有一组包含很多次的文件,这可以节省很多编译时间。另见The Care And Feeding of Precompiled Headers
  3. 不,你没有得到多余的文件内容,就像你在静态链接时没有那样。

答案 2 :(得分:1)

  1. 我想你的问题意味着“为什么编译器不能假设这个标题总是在那里,如果它是强制性的”。原因是VS不想那么偏离标准。如果.cpp文件正在使用头文件中的某些内容,则必须包含它。这样,即使关闭预编译的头文件,您的文件也会编译完全相同(只需要更长的时间)。
  2. 正如其他人所说,如果需要,您可以明确禁用单个文件的预编译头。我们的想法是,您应该只在预编译的头文件中包含您在大多数文件中使用的元素(如果不是全部文件)。
  3. 不,无论是否预编译头,结果对象代码都应该相同。