在多个文件中使用时,没有参数的#pragma hdrstop会怎么做?

Mar*_* Ba 10 c++ precompiled-headers visual-c++

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

请注意,MSDN文档(再一次)对我来说一样清楚.

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

Len*_*ate 11

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

更多详情...

MSDN上的注释说"hdrstop pragma可以让你对预编译文件名和保存编译状态的位置进行额外的控制." 这是真的,但它并不是特别明显有多么有用......

简而言之.

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

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

所以你有一个文件,可能叫做PrecompiledHeader.cpp,它包含你想要包含在预编译头文件中的头文件,并且在包含文件列表的末尾有#pragma hdrstop.这个ONE文件是用/ Yc编译的.

然后,在预编译头文件中包含的文件之后,将所有其他cpp文件与#pragma hdrstop一起使用.这些文件都是用/ Yu编译的.

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

这样做的好处是你的文件中没有一个需要包含一个'全局'预编译的头部构建头文件 - 所以没有stdafx.h或其他什么.这意味着您可以设置构建配置,该构建配置构建没有预编译的头文件,其中所有#pragma hdrstop行都被忽略.

这是"好的",因为这意味着你可以拥有一个'no precomp'构建配置,可以让你快速开发(你可以更改单个头而不强迫世界重建)和其他使用预编译的"普通"配置头.

  • 如果你这样做会更好.但你没必要.如果您的文件位于预编译头中不在的#pragma hdrstop之上,则会在precomp版本中出现构建错误.然后你可以决定它是否被广泛使用以保证是否在precomp中. (2认同)

R. *_*des 5

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

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

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

  2. #pragma hdrstop的filename参数

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

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