24

我了解预编译标头背后的目的和原因。但是,在实施时有什么规则呢?据我了解,它是这样的:

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

这对吗?您是否应该将其排除在预编译头文件中包含的文件中?目前,按照我的直觉,我得到以下编译错误:

错误 C2857:在源文件中找不到使用 /Ycstdafx.h 命令行选项指定的“#include”语句

命令行选项如下:

/Od /I "../External/PlatformSDK/Include" /I ".." /I "../External/atlmfc/Include" /D "_D​​EBUG" /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:prompt

4

4 回答 4

38

您的 stdafx.cpp 应包含 stdafx.h 并使用/Yc"stdafx.h".

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

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

这是用于创建预编译头文件的 stdafx.cpp 的 Visual Studio 设置屏幕截图:

创建预编译头文件

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

选项

这是我的 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
于 2009-10-11T23:43:29.807 回答
10

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

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

你想要的配置是:

  1. 在项目级别选择“所有配置”(项目属性,从调试/发布更改配置下拉菜单),将预编译的标头设置为“使用”
  2. 选择一个 .cpp 文件作为标头的来源(据我所知,哪个无关紧要)
  3. 右键单击并转到属性,然后为预编译头选择“创建”
  4. 最后确保没有其他 .cpp 文件为预编译头属性设置值(您可以通过粗体文本判断)
于 2011-09-07T11:28:39.440 回答
5

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

于 2009-10-11T23:45:42.770 回答
5

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

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

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

于 2009-10-12T09:36:41.340 回答