11

#pragma hdrstop将(无文件名参数)放入几个源(cpp)文件的实际价值(“它做什么”)是什么?

请注意,MSDN 文档(再一次)对我来说就像泥巴一样清晰。

编辑/注意:我问这个,因为这个答案和它链接的文章似乎建议这样做。但我不明白每个编译单元都有一个单独的 pch 文件有什么好处。

4

3 回答 3

13

原始问题的答案是,在既不设置 /Yc 也不设置 /Yu 的文件中使用 #pragma hdrstop 的目的是忽略它,因此您可以设置构建配置,该配置在没有预编译头文件和其他构建配置的情况下构建使用预编译的头文件,您根本不需要更改代码或包含的头文件。

更多详情...

MSDN 上的注释说“hdrstop pragma 使您可以额外控制预编译文件名和保存编译状态的位置。” 这是真的,但它到底有多大用处并不是特别明显......

简而言之。

  • 将#pragma hdrstop 放在没有使用/Yc 或/Yu 编​​译的源文件中根本没有任何效果。
  • 如果您为文件设置了 /Yu,则 hdrstop 会告诉编译器丢弃出现 hdrstop 的行之前的所有内容,并插入预编译的头文件。
  • 如果为文件设置了 /Yc,则 hdrstop 意味着保存所有已编译状态的所有内容,直到 hdrstop 显示为预编译头的行。

诀窍是使用 /Yc 和 /Yu 而不使用可选的头文件名;只需选中“使用”或“创建”单选按钮并将“通过标题”编辑框留空(或编辑项目文件......)。

因此,您有 1 个文件,可能称为 PrecompiledHeader.cpp,其中包含要包含在预编译头文件中的头文件,并且在包含文件列表的末尾有 #pragma hdrstop。这个 ONE 文件是用 /Yc 编译的。

然后,在预编译头文件中的包含文件之后,您将拥有所有其他带有 #pragma hdrstop 的 cpp 文件。这些文件都是用 /Yu 编​​译的。

这将导致 PrecompiledHeader.cpp 构建您的(在此示例中)单个 pch 文件以及使用该单个 pch 文件的所有其他文件。

这样做的好处是您的所有文件都不需要包含“全局”预编译头文件构建头文件 - 所以不需要 stdafx.h 或其他任何东西。这意味着您可以设置一个构建配置,该配置在没有预编译头文件的情况下构建,其中所有#pragma hdrstop 行都被简单地忽略。

这是“好”,因为这意味着您可以拥有一个“无预编译”构建配置,让您可以快速开发(您可以更改单个标头而不强制重建世界)和其他使用预编译的“正常”配置标题。

于 2013-07-04T12:44:14.713 回答
5

之前的所有代码#pragma hdrstop都将成为预编译头文件的一部分。如果没有给出文件名参数,则头文件的名称将是带有 .PCH 扩展名的源文件的基本名称,如文档中所述

预编译头文件的名称根据以下规则确定,按优先顺序排列:

  1. /Fp 编译器选项的参数

  2. #pragma hdrstop 的文件名参数

  3. 带有 .PCH 扩展名的源文件的基本名称

所以,如果你在一个名为blah.cpp它的文件上拥有它,它将生成一个名为blah.pchIFF 的文件,编译时使用/Yc(只有一个文件应该设置)。

于 2011-09-02T11:45:06.200 回答
4

如果不在#pragma hdrstop您的 C/C++ 项目中使用,您可以使用专用的 .cpp 文件作为创建的 .pch 的源文件。

如果#pragma hdrstop在您希望创建 .pch 文件的 .cpp 文件中使用,.cpp 文件可以在 .cpp 行之后包含其他有用的内容#pragma hdrstop。当您第一次使用 /Yc 编译选项编译此 .cpp 文件时,您将获得 .pch 文件和 .obj 文件。当你修改了.cpp文件并使用/Yu编译选项重新编译时,编译器会将.pch文件之前的内容替换为#pragma hdrstop.pch文件并重新编译..obj行之后的部分#pragma hdrstop,创建一个新的.obj文件,节省编译时间。您的项目只有一个源文件非常有用。

对于只使用预编译头文件的源文件,这#pragma hdrstop是编译器的标志,应该用 .pch 文件替换哪个部分,因此您无需使用 /Yu 编​​译选项指示头文件名。

于 2013-07-01T21:26:23.483 回答