在VS中开启“显示所有文件”选项后,我添加了一个文件夹并在其中创建了一个新的类。由于我正在使用预编译头文件,因此还需要相对于新的类文件包含位于根目录下的stdafx.h。
在我的cpp文件中,我有:
#include "..\stdafx.h"
然而我收到了以下错误信息:
错误 C1010: 查找预编译头时遇到意外的文件结尾。你是否忘记在源文件中添加'#include "stdafx.h"'?
我的理解是,'..'应该指示编译器向上一级目录进入?
在VS中开启“显示所有文件”选项后,我添加了一个文件夹并在其中创建了一个新的类。由于我正在使用预编译头文件,因此还需要相对于新的类文件包含位于根目录下的stdafx.h。
在我的cpp文件中,我有:
#include "..\stdafx.h"
然而我收到了以下错误信息:
错误 C1010: 查找预编译头时遇到意外的文件结尾。你是否忘记在源文件中添加'#include "stdafx.h"'?
我的理解是,'..'应该指示编译器向上一级目录进入?
Visual C++允许您定义多种设置预编译头文件的方法。最常见的方法是在项目配置级别为所有源文件启用它,在“Configuration Properties/C++/Precompiled Headers”下,将“Precompiled Header”设置为“Use”。在同一位置,将“Precompiled Header File”设置为通常为“stdafx.h”。所有文件都将获取此设置(因此是项目的配置)除了......
有一个文件负责生成PCH文件。该文件通常是项目中的stdafx.cpp文件,并且通常除了#include "stdafx.h"
之外没有其他内容。为该文件配置预编译头文件,从“Use”切换到“Create”。这样可以确保如果PCH的主头文件不同步,则始终首先编译stdafx.cpp以重新生成PCH数据文件。在Visual Studio中配置PCH设置的其他方法也存在,但这是最常见的方法。
话虽如此,您遇到的问题肯定很烦人。用于引导PCH系统并在上述“Use...”和“Create...”设置上指定的文件名必须与#include语句中的文本完全匹配。
因此,非常有可能您可以通过将“..”添加到项目包含目录中并从#include语句中删除“..”来解决问题。您还可以将其更改为作为整体标头的项目配置级别为“..\stdafx.h”,但如果您在多个文件夹中层次结构地拥有源文件,则可能会出现问题。
哦,如果您在浏览PCH配置设置时不清楚,如果您不想为任何特定源文件使用PCH(有时确实有理由不使用),则可以关闭它,否则请确保始终在每个源文件的头部(c/cpp等) #include "your-pch-include-file.h"。
希望您能摆脱这个问题。
一般我也喜欢在我的项目中有一个层次结构,并且我发现有两种简单的方法来包含一个预编译头文件:
要么
将存放stdafx.h
的目录添加到编译器的包含目录中。
(属性 - VC++目录 - 包含目录: 添加$(ProjectDir)
)
要么
如果没有太多的子目录,解决错误信息的一个简单方法如下:
stdafx.h
文件,该文件仅包括顶级的stdafx.h
:
#include "..\stdafx.h"
#include "stdafx.h"
,而不是在那里包含顶层文件。这样,所有的代码文件都使用相同的预编译头文件,而且没有其他复杂的设置要做。
有趣的是,我使用的技巧并没有在答案中:
不要更改任何CPP文件; 保持您的头文件不变。按原样构建即可。
无需打字,无需RSI,无需处理包含路径,也没有其他痛苦和烦恼。美妙的是,当您将解决方案移动到另一个平台时,它仍将起作用。棒极了。
"../stdafx.h"
)。请注意,这是繁琐且容易出错的,因为它是基于每个文件的设置,未来添加文件的开发人员将不得不遵循相同的步骤。如果他们没有这样做,他们将面临警告和错误,例如:
warning C4627: '#include "<path>"': skipped when looking for
precompiled header use.
和
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?
这些都没有给出更多的指示或其他方法。
我想他们最终会转向StackOverflow并在此结束... 您好,感谢您的阅读。
基于这个基础,使用其他替代方案值得考虑,例如将 $(ProjectDir)
放在 C++ 包含路径(在C++\常规下)中,但这可能会在包含其他头文件时引起混乱。
#include "PCH_NAME_HERE"
。 PCH_NAME_HERE
就是PCH的名称。没有目录,什么都没有。只需按编译器选项中指定的PCH名称即可。..\
部分了。
$(ProjectDir)/pch/my_pch.h
Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch
此配置默认应用于项目中的所有文件。但是,stdafx.cpp 的配置设置在文件级别上,并覆盖了预编译头的值:
Precompiled Header: Create (/Yuc)
#include "stdafx.h"
由于检查使用简单的字符串比较而不是任何类型的目录搜索,因此(无论源文件相对于项目根目录的位置或stdafx.h文件的位置如何),在include指令中使用的路径和文件名必须与项目的预编译头文件配置设置完全匹配。这种意外的副作用是,如果您有一个包含各种源文件的项目子目录,在这些文件中,您不需要使用相对路径(如..\stdafx.h)引用stdafx.h文件(如果您这样做,VS将引发错误,指出它在查找预编译头时遇到了文件结尾)。
只需使用未装饰的#include "stdafx.h",它就可以正常工作,因为VS将识别此指令以使用预编译头,并且它已经知道正确的预编译头的位置,因为stdafx.cpp预编译头配置设置为“创建(/Yc)”。
如果您的项目的 .cpp 和 .h 文件位于不同的子目录中(而不是明确在项目目录中),那么使用相对于解决方案目录的包含路径(如果您不使用专用的包含目录)将是一个良好的编码风格。特别是如果您在一个解决方案中有多个项目,并且需要共享包含文件(例如,用于项目之间的互操作性,例如 .exe 和 .dll)。
要重构您的项目,您需要执行以下操作:
C:
。我已经编辑了答案,使意思更加清晰:我指的是解决方案目录或专用的include
目录作为根目录,这样引用包含文件的路径就是相对于这些目录的。在将整个解决方案移动到同一台计算机上的不同目录或计算机之间时,这不会有任何问题。 - Serge Rogatch#include "PROJECT_NAME\stdafx.h"
,如果按照上述步骤操作,它是有效的。如果您尝试过但没有成功,那么错误是什么? - Serge Rogatch使用引号表示它是你自己的头文件 <>
表示它是一个系统头文件,如果我没有搞错,只需使用 #include <stdafx.h>
让编译器找到它即可
#include "PCH_NAME_HERE.h"
时替换预编译符号,通过将PCH_NAME_HERE.h
转换为具有预编译符号的实际文件名。PCH_NAME_HERE.h
仍然是技术上的常规头文件;其背后的想法是您可以像没有使用PCH一样编译相同的文件。 - Nicol Bolas