混乱的原因是,Visual Studio中治疗的包括指令,其包括预编译的头不同,以其它包含指令。具体地它不看为预编译使用普通路径查找方法,它只是试图通过简单字符串比较来将include指令与项目配置中定义的include指令进行匹配
预编译器头配置设置为gobally,但可以对每个文件进行覆盖。 (通过项目属性 - >配置属性 - > C/C++ - >预编译头文件访问)为:
Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch
此配置默认应用于项目中的所有文件。然而,对于stdafx.cpp的配置被设定在文件级并覆盖预编译头值:
Precompiled Header: Create (/Yuc)
这样做的效果是,对于任何的源文件构造,其通过使用该预编译的头(默认是除了stdafx.cpp之外的所有它们)VS将查找与配置的预编译头文件值相匹配的include指令。例如
#include "stdafx.h"
因为校验使用简单字符串比较,而不是任何种类的目录搜索的,则(不论相对于源文件项目的根目录或StdAfx.h文件的位置的位置)的包含指令中使用的路径和文件名必须与项目预编译头文件配置设置使用的完全匹配。这意想不到的副作用是,如果你有一个包含各种源文件的项目子目录,在这些文件中,你不需要使用像.. \ stdafx.h这样的相对路径来引用stdafx.h文件(如果你做VS会引发一个错误,指出它在查找预编译头文件时遇到了文件的结尾)。
只需使用未包含的#include“stdafx.h”,它将正常工作,因为VS会将此识别为使用预编译头的指令,并且它已知道正确预编译头的位置是由于stdafx.cpp预编译头部配置设置为“创建(/ Yc)”。
-1:'stdafx.h'不是系统文件。这是一个预编译的头文件。 –
不是一个Windows的家伙,那么它为什么有一个.h扩展名? –
因为它是一个头文件。它可能是预编译的,但它仍然是一个头文件。 –