4

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

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 的麻烦

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

4

3 回答 3

1

这应该工作

  1. 右键单击解决方案文件
  2. 单击在 Windows 资源管理器中打开
  3. 在资源管理器中找到文件 stdfx.h 并复制文件夹的路径
  4. 在 Visual Studio 解决方案资源管理器中,右键单击项目文件
  5. 单击属性-> C/C++ -> 常规
  6. 在 Additional Include Directories 中粘贴路径
于 2012-10-22T11:13:31.153 回答
1
  1. 在VC中结合文件夹和虚拟文件夹在我看来很混乱,因为虚拟文件夹表明所有文件都在一个目录中,而在硬盘上创建的文件夹显然表明所有文件都在不同的目录中。如果你知道发生了什么,你可以结合它,但在你的情况下,我不推荐它。

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

  3. 清理您的 stdafx.h 文件后,将尽可能多的头文件包含到您的 .cpp 文件中,并且只有在头文件中需要它们时才将这些包含在您的头文件中

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

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

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

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

于 2012-10-22T11:15:47.830 回答
1

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

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

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

您可能会决定您自己的一些库是“一成不变的”并且也可以包含在内。

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

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

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

后一种排序应该包括您的 stdafx.h 文件,并且理想情况下不应与从项目外部包含的那些头文件位于同一目录中。

于 2012-10-22T11:29:06.550 回答