2009-10-11 145 views
21

我了解预编译头文件的目的和推理。但是,实施它们时的规则是什么?从我的理解,它是这样的:如何在您的项目中实现预编译头文件

  1. 设置您的项目使用预编译的标题与YU指令。
  2. 创建您的stdafx.h文件并将其设置为您的预编译头。
  3. 包括此作为您的每个.h文件中的顶部include语句。

这是正确的吗?你是否应该将它包含在预编译头文件中的文件中?

错误C2857:目前,我与这个下面我的直觉时,遇到下列编译错误与/Ycstdafx.h 命令行选项指定“的#include”声明 在 源文件未找到

命令行选项是因为这样:

/OD/I “../External/PlatformSDK/Include”/ I “..”/ I” ../ External/atlmfc/Include“ /D”_DEBUG“/ D”_UNICODE“/ D”UNICODE“ /Gm/EHsc/RTC1/MDd /Yc"stdafx.h” /Fp"....\Output\LudoCore \ Debug \ LudoCore.pch“ /Fo”.... \ Output \ LudoCore \ Debug \“ /Fd"....\Output\LudoCore\Debug\vc80.pdb” /W4/WX/nologo/C/ZI/TP/wd4201 /errorReport:提示

回答

34

您stdafx.cpp应包括stdafx.h中,并使用/Yc"stdafx.h"建造。

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

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

下面是在Visual Studio设置的屏幕截图stdafx.cpp创建一个预编译的头:

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 
+0

你是说这应该只在命令行中生成?在视觉工作室中,我不确定如何用蝙蝠的某个属性创建某个东西。它似乎总是“添加 - >新项目 - >标题”等。 – Chris 2009-10-12 00:42:19

+0

右键单击cpp文件并在上下文菜单上选择“属性”。在C++配置属性页面中,有一个用于“预编译头文件”,用于指定此CPP文件创建或使用预编译头文件。 – ChrisW 2009-10-12 00:50:00

+0

感谢您的更新。我已经完成了如上所示,仍然没有骰子。以下是与上述有关的命令行选项:/ Od/I“../External/PlatformSDK/Include”/ I“..”/ I“../External/atlmfc/Include”/ D“_DEBUG”/ D“_UNICODE”/ D“UNICODE”/ Gm/EHsc/RTC1/MDd /Yc"stdafx.h“/Fp"..\..\Output\LudoCore\Debug\LudoCore.pch”/ Fo“.. \。 。\ Output \ LudoCore \ Debug \\“/Fd"..\..\Output\LudoCore\Debug\vc80.pdb”/ W4/WX/nologo/c/ZI/TP/wd4201/error报告:提示 – Chris 2009-10-12 01:49:26

5

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

+0

我认为他的问题是指定/Ycstdafx.h而不是/Yc"stdafx.h“。 – ChrisW 2009-10-11 23:47:14

5

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

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

当你现在编译y.cpp的文件,/Yu"X.pch",编译器读取并丢弃一切都交给#include "X.h"。此时,除了输入流(保留为Y.cpp,文件指针设置为#include "X.h"之后的下一行)之外,它将用存储在X.pch中的状态替换其内部状态。

+0

刚编辑修复了一个错字。 – 2013-09-13 16:37:21

10

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

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

你想要的配置是:

  1. 在项目层面与选择“所有配置”(项目属性,更改配置下降,由调试/释放下),设置你的预编译头“使用”
  2. 选择一个.cpp文件是包头的源(据我所知并不重要的一个)
  3. 右键单击并转到属性,然后选择预编译头“创建”
  4. 最后确认没有其他.cpp文件为预编译设置了值头文件属性(你可以通过粗体文本来判断)
+0

修复了一个错字:“每编译”固定为“预编译”。 – 2013-09-13 16:38:40