Chr*_*ris 24 c++ visual-studio-2005 include precompiled-headers visual-c++
我理解预编译头文件的目的和原因.但是,实施它们的规则是什么?根据我的理解,它是这样的:
这是对的吗?您是否应该将其包含在预编译头文件中包含的文件中?目前,在遵循我的直觉时,我得到以下编译错误:
错误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:prompt
Chr*_*isW 37
你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
Run Code Online (Sandbox Code Playgroud)
Spe*_*ose 10
Visual Studio不仅可以按项目存储预编译的头属性,还可以存储源文件.
默认情况下,所有属性都设置为"从父级或项目默认值继承",它只显示该对象的父对象的值,但是一旦在子级别覆盖(在本例中为.cpp文件),该文件将忽略父属性的更改.
您想要的配置是:
"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").