28

使用 VS 中的“显示所有文件”选项,我添加了一个文件夹并在该文件夹中创建了一个新类。由于我使用的是预编译头文件,因此我还需要包含与新类文件相关的根目录中的 stdafx.h。

在我的 cpp 文件中,我有

#include "..\stdafx.h"

但是我收到以下错误:

错误C1010:查找预编译头时文件意外结束。您是否忘记将 '#include "stdafx.h"' 添加到您的源代码中?

我的理解是,.. 应该指示编译器上一级目录?

4

9 回答 9

21

Visual C++ 允许您定义几种设置预编译头文件的方法。最常见的是在项目配置级别为所有源文件启用它,在 Configuration Properties/C++/Precompiled Headers 下,设置“Precompiled Header”,选择“Use”。设置“预编译头文件”的相同位置通常是“stdafx.h”。所有文件都将获得此设置(因此项目中的配置)除了....

一个文件负责生成 PCH 文件。该文件通常是项目中的 stdafx.cpp 文件,它通常除了#include "stdafx.h". 为那个文件配置预编译头文件,从“使用”切换到“创建”。这确保了如果 PCH 的主要标头不同步,stdafx.cpp 总是首先编译以重新生成 PCH 数据文件。在 Visual Studio 中还有其他配置 PCH 设置的方法,但这是最常见的。

话虽这么说,你的问题肯定很烦人。用于启动 PCH 系统并在上面的“使用...”和“创建...”设置中指定的文件名必须与您的 #include 中的文本完全匹配

因此,您很有可能可以通过将“..”添加到项目包含目录并从#include 语句中删除“..”来解决您的问题。您也可以在项目配置级别将其更改为“..\stdafx.h”作为直通标题,但如果您在多个文件夹中分层放置源文件,这可能会出现问题。

哦,如果您在阅读 PCH 配置设置时不清楚,如果您不想将 PCH 用于任何特定的源文件(并且有时有理由不这样做),您可以将其关闭以用于特定的源文件,否则请确保在每个源文件(c/cpp 等)的开头始终包含 #include "your-pch-include-file.h"。

希望你能休息一下。

于 2012-09-15T06:08:09.937 回答
17

我通常也喜欢在我的项目中使用分层顺序,我发现有两种简单的方法可以包含预编译的标头:

任何一个

  1. 将所在的目录stdafx.h放入编译器的包含目录中。

    属性- VC++ 目录-包括目录:添加$(ProjectDir)

或者

  1. 如果没有太多的子目录,一个简单的绕过错误信息的方法是这样的:

    • stdafx.h文件放入每个仅包含顶级的子目录中stdafx.h
      #include "..\stdafx.h"
    • #include "stdafx.h"为子目录中所有源文件的第一行,而不是在其中包含顶级文件。

这样,您的所有代码文件都使用相同的预编译头文件,无需进行其他复杂的设置。

于 2015-10-27T16:34:55.897 回答
14

有趣的是,我使用的技巧不在答案中:

  1. 在项目的根文件夹中创建 stdafx.h 和 stdafx.cpp。
  2. 转到项目属性-> 预编译头文件。改为“使用”。
  3. 转到stdafx.cpp,右键单击属性-> 预编译头文件。改为“创造”。
  4. 转到项目属性-> 高级;将“强制包含文件”更改为 stdafx.h;%(ForcedIncludeFiles)

不要更改任何 CPP 文件;保持你的头文件原样。按原样构建。

没有打字,没有 RSI,没有包含路径的麻烦,没有其他痛苦和痛苦。美妙之处在于,当您将解决方案转移到另一个平台时,它仍然可以工作。惊人的。

于 2016-06-08T17:47:28.023 回答
4

您可以基于每个文件调整预编译头设置。

  1. 在解决方案资源管理器中右键单击 .cpp 文件,选择“属性”。
  2. 我强烈建议在配置下拉列表项中选择“所有配置”。
  3. 浏览到“C/C++”-“预编译头文件”。
  4. 将“预编译头文件”从“stdafx.h”调整为您需要的任何内容(例如在您的情况下"../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++\General 下),但在包含其他头文件时可能会导致混淆。

于 2015-04-30T10:55:41.887 回答
2

PCH 文件很奇怪,在 Visual Studio 中更是如此。编译使用 PCH 的 .cpp 文件时,VS 期望第一个非注释/空白文本为#include "PCH_NAME_HERE". 这PCH_NAME_HERE正是PCH 的名称没有目录,什么都没有。只是编译器选项中指定的 PCH 名称。

如果你打算做这个目录伪造,那么你需要修改你的编译器设置,以便 PCH 所在的目录在目录搜索路径中。这样,您就不需要拥有该..\部分。

于 2012-09-15T03:26:50.687 回答
1

我建议使用:

$(ProjectDir)/pch/my_pch.h

作为“预编译头文件”
“高级>强制包含文件”

这将在开始时自动包含pch您的.cpp文件,因此文件中无需更改任何.cpp内容。

这比更改包含目录要好,因为有时您可能pch在包含目录中有多个文件,然后您无法分辨出使用了哪个文件。

于 2017-04-22T20:35:02.480 回答
0

造成混淆的原因是 Visual Studio 将包含预编译头的 include 指令与其他 include 指令区别对待。具体来说,它不使用普通路径查找方法来查找预编译的标头,而是通过简单的字符串比较尝试将包含指令与项目配置中定义的指令相匹配。

预编译器头配置是全局设置的,但可以按文件覆盖。正常的全局配置(通过 Project Properties -> Configuration Properties -> C/C++ -> Precompiled Headers 访问)是:

Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch

默认情况下,此配置应用于项目中的所有文件。但是,stdafx.cpp 的配置是在文件级别设置的,并将 Precompiled Header 值覆盖为:

Precompiled Header: Create (/Yuc)

这样做的效果是,对于配置为使用预编译头文件的任何源文件(默认情况下是除 stdafx.cpp 之外的所有源文件),VS 将查找与配置的预编译头文件值匹配的包含指令。例如

#include "stdafx.h"

因为检查使用简单的字符串比较而不是任何类型的目录搜索,所以(无论源文件相对于项目根目录的位置或 stdafx.h 文件的位置)包含中使用的路径和文件名指令必须与项目的预编译头文件配置设置使用的完全匹配。这样做的意外副作用是,如果您有一个包含各种源文件的项目子目录,则在这些文件中您不需要使用 ..\stdafx.h 之类的相对路径引用 stdafx.h 文件(如果您使用 VS将引发一个错误,指出它在查找预编译头时遇到了文件结尾)。

只需使用未经修饰的#include "stdafx.h" 就可以正常工作,因为 VS 会将此识别为使用预编译头的指令,并且它已经知道正确的预编译头在哪里,因为 stdafx.cpp 预编译头配置正在设置为“创建 (/Yc)”。

于 2015-08-06T10:21:50.630 回答
-1

如果您的项目的 .cpp 和 .h 文件位于不同的子目录中(而不是明确地在项目目录中),那么使用相对于解决方案目录的包含路径将是一种很好的编码风格(如果您不使用专用的包括目录)。特别是如果您在一个解决方案中有多个项目并且需要共享包含文件(例如,为了项目之间的互操作性,例如 .exe 和 .dll)。

要重构您的项目,您需要执行以下操作:

  1. 在每个项目中指定额外的包含目录 $(SolutionDir) :右键单击项目,单击“属性”,转到“配置属性”->“C/C++”->“常规”(一次对所有配置执行此操作,从“配置”下拉菜单中选择“所有配置”)
  2. 转到“C/C++”->“预编译头文件”并将“预编译头文件”值更改为相对于解决方案目录的路径,例如 PROJECT_NAME/stdafx.h
  3. 在您的 .cpp 文件中包含“PROJECT_NAME/stdafx.h”,而不仅仅是“stdafx.h”
  4. 在您的 .h 和 .cpp 文件中,包含某些内容时,使用路径作为“PROJECT_NAME/dir1/dir2/file.h”,除非包含来自同一目录的文件
于 2015-06-05T07:54:53.610 回答
-4

使用引号意味着它是您自己的头文件使用<>意味着它是系统头文件如果我没记错就使用#include <stdafx.h>并让编译器找到它

于 2012-09-15T03:22:33.047 回答