如何在项目中实现预编译的头文件

时间:2009-10-11 23:15:08

标签: c++ visual-c++ visual-studio-2005 include precompiled-headers

我理解预编译头文件的目的和原因。但是,实施它们的规则是什么?根据我的理解,它是这样的:

  1. 将项目设置为使用带有YU指令的预编译头文件。
  2. 创建stdafx.h文件并将其设置为预编译头文件。
  3. 在每个.h文件中包含此作为top include语句。
  4. 这是对的吗?您是否应该将其包含在预编译头文件中包含的文件中?目前,在遵循我的直觉时,我得到以下编译错误:

      

    错误C2857:'#include'语句   用/Ycstdafx.h指定   找不到命令行选项   源文件

    命令行选项如下:

      

    / Od / I.   “../External/PlatformSDK/Include”/我   “..”/我“../External/atlmfc/Include”   / D“_DEBUG”/ D“_UNICODE”/ D“UNICODE”   / Gm / EHsc / RTC1 / MDd /Yc"stdafx.h“   /Fp"....\Output\LudoCore\Debug\LudoCore.pch”   / FO “.... \输出\ LudoCore \调试\”   /Fd"....\Output\LudoCore\Debug\vc80.pdb”   / W4 / WX / nologo / c / ZI / TP / wd4201   / errorReport:提示

4 个答案:

答案 0 :(得分:37)

你stdafx.cpp应该包含stdafx.h并使用/Yc"stdafx.h"构建。

您的其他* .cpp应该包含stdafx.h并使用/Yu"stdafx.h"构建。

请注意编译器选项中使用的双引号字符!

以下是stdafx.cpp的Visual Studio设置的屏幕截图,用于创建预编译的标头:

create precompiled header

以下是相应的命令行选项(它们是只读的但反映了在其他页面上指定的设置;请注意,IDE在编译器选项中在文件名周围插入双引号字符):

options

这是我的stdafx.cpp文件中的内容:

// stdafx.cpp : source file that includes just the standard includes
// CallWinsock.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

答案 1 :(得分:10)

Visual Studio可以存储预编译的头文件属性,不仅仅是项目,还有源文件。

默认情况下,所有属性都设置为“从父级或项目默认值继承”,它只显示该对象的父对象的值,但是一旦在子级别覆盖(在本例中为.cpp文件),该文件将忽略父母财产。

您想要的配置是:

  1. 在项目级别选择“所有配置”(项目属性,从调试/发布更改配置下拉列表),将预编译的标题设置为“使用”
  2. 选择一个.cpp文件作为标题的来源(据我所知并不重要)
  3. 右键单击并转到属性,然后为预编译标题选择“创建”
  4. 最后确保没有其他.cpp文件为预编译的标题属性设置了值(您可以通过粗体文本来判断)

答案 2 :(得分:5)

您的#include "stdafx.h"应该是每个cpp文件的第一行。它不应该用在.h文件中。除此之外,你是对的。

答案 3 :(得分:5)

“stdafx”只是一个惯例。这绝不是强制性的。在多项目解决方案中,我使用了其他设置,其中包含多个预编译的标头,用于不同的部分。例如。将UI项目共享一个PCH,为数据库项目共享另一个PCH可能很有用。

相关组件是列出预编译头的Xh文件,仅包含Xh的X.cpp文件(并且本身不添加代码),以及通过编译器编译X.cpp(以及Xh)创建的X.pch文件选项/Yc

当您现在使用/Yu"X.pch"编译Y.cpp文件时,编译器会读取并丢弃所有内容,直到#include "X.h"。此时,它将内部状态替换为存储在X.pch中的状态,但输入流除外(保留Y.cpp,文件指针设置为#include "X.h"之后的下一行)。