C++ 如何在项目中实现预编译头

C++ 如何在项目中实现预编译头,c++,visual-c++,visual-studio-2005,include,precompiled-headers,C++,Visual C++,Visual Studio 2005,Include,Precompiled Headers,我理解预编译头背后的目的和推理。但是,在实施时有哪些规则?根据我的理解,是这样的: 将项目设置为使用YU指令的预编译头 创建stdafx.h文件并将其设置为预编译头 在每个.h文件中,将此作为最上面的Include语句包含 这是正确的吗?是否应排除将其包含在预编译头中的文件中?目前,当我按照直觉进行此操作时,我得到以下编译错误: 错误C2857:“#include”语句 使用/Ycstdafx.h指定 在中找不到命令行选项 源文件 命令行选项如下所示: /Od/I “./External/Pla

我理解预编译头背后的目的和推理。但是,在实施时有哪些规则?根据我的理解,是这样的:

  • 将项目设置为使用YU指令的预编译头
  • 创建stdafx.h文件并将其设置为预编译头
  • 在每个.h文件中,将此作为最上面的Include语句包含
  • 这是正确的吗?是否应排除将其包含在预编译头中的文件中?目前,当我按照直觉进行此操作时,我得到以下编译错误:

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

    命令行选项如下所示:

    /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 /错误报告:提示


    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
    
    您的
    #include“stdafx.h”
    应该是每个cpp文件的第一行。它不应该在.h文件中使用。除此之外,你几乎是对的。

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

    相关组件包括列出可预编译头的X.h文件、仅包含X.h的X.cpp文件(并且不添加任何代码本身)以及通过使用编译器选项
    /Yc
    编译X.cpp(从而编译X.h)创建的X.pch文件


    当您现在使用
    /Yu“X.pch”
    编译Y.cpp文件时,编译器将读取并丢弃
    #include“X.h”
    之前的所有内容。此时,它将其内部状态替换为存储在X.pch中的状态,但输入流除外(仍然是Y.cpp,文件指针设置为
    #include“X.h”
    )。

    Visual studio不仅可以按项目而且可以按源文件存储预编译的头属性

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

    您需要的配置是:

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

  • 我认为他的问题是指定/Ycstdafx.h而不是/Yc“stdafx.h”。你是说这应该只在命令行中生成吗?在VisualStudio中,我不知道如何立即创建具有特定属性的内容。它似乎总是只是“添加->新建项目->标题”,等等右键单击cpp文件并在上下文菜单上选择“属性”。在C++配置属性页中,有一个用于“预编译头”,您可以使用它指定这个CPP文件创建或使用预编译的头文件。我已经做了如上所示,仍然没有骰子。以下是与上述命令行选项相关的命令行选项:/Od/I“./External/PlatformSDK/Include”/I“./I“./External/atlmfc/Include”/D“\u-DEBUG”/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您的stdafx.cpp的内容是什么(通过编辑并将其添加到原始问题中来显示)?您的stdafx.h在哪个目录中?如果它有内容,我会将其添加到问题中,但它是空的,除了现在包含相应的头文件。修复了一个拼写错误:“每编译”修复为“预编译”。