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
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文件)被重写,该文件将忽略父级属性的更改
您需要的配置是:
我认为他的问题是指定/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在哪个目录中?如果它有内容,我会将其添加到问题中,但它是空的,除了现在包含相应的头文件。修复了一个拼写错误:“每编译”修复为“预编译”。