【问题标题】:Visual Studio C++ able to compile with compile errors (red underlines)Visual Studio C++ 能够通过编译错误进行编译(红色下划线)
【发布时间】:2012-10-22 10:47:41
【问题描述】:

我遇到了编译错误(红色下划线)的问题,例如:

Error: cannot open source file "stdafx.h"

这里是编辑后的环境截图:

左侧是我的 Visual Studio 解决方案目录列表,其中“显示所有文件”已关闭。

我正在做一个学校项目,每个文件夹都是项目不同部分的源文件,由不同的人负责。

例如,学生 A 和 B 负责 AST 和 PARSER 文件夹(我们将它们称为子项目)。 我们为每个子项目都有一个 API,以便其他子项目知道要调用什么。

在 TOP-CENTER,我们有我的课程源文件QueryProcessor。 (只是前几行) 在其下方,是Build Success 的输出。

红线遍布所有类,主要是环境无法打开#include "stdafx.h"

在右侧,即stdafx.h,我们包含所有不同的子项目,因此我们省去了每个项目都有不同的 stdafx.h 的麻烦

但是,我能够构建该项目。我很确定我做错了这个目录/链接。

【问题讨论】:

  • 我有点困惑,通常 Visual Studio 没有任何子文件夹,因此使用 #include "PKB/PKB.h" 应该不起作用。如果您使用显示所有文件并为所有文件创建目录,这将是正确的。为什么 std 有下划线但仍在编译可能是因为其他一些类包含 iostream。啊,现在我明白了,你们创建了子文件夹,但禁用了显示所有文件,然后将文件包含到 Visual Studio 中的每个虚拟文件夹中,不是吗?
  • 哦..我没有这样做,但我认为是这样。
  • 所以我们需要在显示所有文件夹时包含文件?虚拟文件夹是什么意思?
  • 虚拟文件夹是指你在VC中看到的文件夹并不是真正的文件夹。 VC 只会给人一种你有文件夹的错觉,但实际上所有文件都在一个目录中。但是您的教授或老师或创建此项目的人创建了这些虚拟文件夹,并将源文件包含在硬盘驱动器上的真实文件夹中。

标签: c++ visual-studio-2010 visual-c++


【解决方案1】:

这应该有效

  1. 右键单击解决方案文件
  2. 点击在 Windows 资源管理器中打开
  3. 在资源管理器中找到文件stdfx.h并复制文件夹路径
  4. 在 Visual Studio 解决方案资源管理器中,右键单击项目文件
  5. 点击属性-> C/C++ -> 常规
  6. 在附加包含目录中粘贴路径

【讨论】:

    【解决方案2】:
    1. 在我看来,在 VC 中将文件夹和虚拟文件夹结合起来很麻烦,因为虚拟文件夹表明所有文件都在一个目录中,而在硬盘驱动器上创建的文件夹显然表明所有文件都在不同的目录中。如果你知道发生了什么,你可以结合它,但在你的情况下,我不推荐它。

    2. 我假设您误解了 stdafx.h 的用途 此头文件的目的不是将所有头文件都放入其中,然后将其包含到所有其他文件中。这是一个关于这个Purpose of stdafx.h

    3. 的问题
    4. 清理完您的 stdafx.h 文件后,将尽可能多的头文件包含到您的 .cpp 文件中,并且仅在头文件中需要时才将这些包含在您的头文件中

    5. 打开显示所有文件,现在您将使用实际文件夹,并且您可以确定,如果您对“PKB”之类的文件夹进行寻址,则该文件夹确实存在,因为您可以在左侧的解决方案资源管理器中看到它。

    6. 如果你使用 using namespace std;例如,确保您还包含所需的头文件。你可能会想“嘿,我已经在另一个头文件中包含了例如 iostream,我现在将它包含在这个头文件中,所以我不需要它”当你处理更大的项目时,这真的会毁了你。

    哦,关于 stdafx.h 包含问题,一旦您切换到显示所有文件,我假设您会意识到 stdafx 与您使用包含的文件位于不同的文件中。可能需要#include "..\stdafx.h" 之类的内容(取决于您的结构)。

    我认为这是显而易见的,但如果你包含一个头文件,那么包含总是相对于包含另一个头文件的文件。

    【讨论】:

      【解决方案3】:

      stdafx.h 通常用于创建预编译头文件,这本质上是一种编译时优化,因此编译器不会为每个编译单元不断地编译这些头文件。

      如果这些标头中的任何一个发生更改,您将需要进行完整的系统重建。

      实际上,最好只使用它来包含您永远不会更改的标准头文件和第三方头文件(如 boost 库和类似的)。

      您可以决定自己的某些库是“一成不变的”,也可以包含在内。

      每个项目,即构建到单独单元(DLL 或 .exe)中的项目的每个部分都应该有自己的预编译头文件和自己的 stdafx.h 版本

      项目应该只包含他们自己的 .stdafx 而不是其他项目的,因此这个头文件也可以用来定义你的 dllexport 宏。

      在安排项目标题时,您应该注意: 1. 外部包含哪些标头 2. 哪些头文件只包含在内部,甚至没有间接包含在外部。

      后一种类型应包含您的 stdafx.h 文件,并且最好不要与项目外部包含的头文件位于同一目录中。

      【讨论】:

        猜你喜欢
        • 2017-03-25
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 2015-12-13
        相关资源
        最近更新 更多