如何在Visual Studio中包含子目录?

20

我必须包含许多不同子目录下的头文件。在Visual Studio(我使用2005版本)中,是否有一种设置一个包含路径,以便Visual Studio也可以搜索头文件所在的子目录的方法?

5个回答

27

为了解决一个包含问题,将文件夹搜索路径设置在Visual Studio设置中通常从设计角度来看并不是一个好主意,因为您的代码会在具有不同目录结构的不同计算机上变得不太可移植。

我的建议是为您的代码定下一个组织形式,使子目录的相对路径(相对于包含代码)固定:

  • 将“基础文件夹”添加到项目中(项目属性 -> 配置属性 -> C/C++ -> 其他包含目录,“附加包含目录”
  • 将子目录添加到#include语句中,即#include "subdirectory/somefile.h"

这样做的额外好处是能够看到您的Solution中的哪个文件夹包含该文件-当您试图找到正确的路径或确定文件用途时,这通常很有用。


太棒了.. :^) - kmiklas

6
我们还没有找到在 Visual Studio 中设定递归文件夹搜索的方法(尽管 Xcode 可以轻松设置和使用它们)。我们所做的是将所有目录列在一个文件中,并在 C/C++ 命令行附加选项中指定该文件: @"IncludeFolders.rsp"
我们很少会遇到使用递归搜索出现问题,尽管有一次意外包含了“/”符号,导致速度变慢了一些。

1

我发现在大多数情况下,包括在MSVC中,我可以通过使用SUBST命令的巧妙技巧来缩短路径长度。 我将展示一个缩短默认继承的C ++包含路径的示例,但您也可以为项目相关的包含路径执行此操作。 首先创建一个或多个类似以下内容的批处理文件(并从Windows资源管理器或命令行运行它们):

MDrive.bat:
subst M: /D
subst M: "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC"

WDrive.bat:
subst W: /D
subst W: "C:\Program Files (x86)\Windows Kits\8.1\Include"

... This is just and example.  You would do this for your
    project related include directories.

对于较长的路径,您可以创建多个这些。在上面的情况下,我仅缩短了MSVC默认使用的标准继承路径。顺便说一句,Subst命令可以在没有管理员权限的情况下运行,但不要占用现有的物理或映射驱动器字母(我不确定会发生什么 - 我现在不想测试它)。

这一步是可选的。我在MSVS 2010+中添加了一个自定义属性表。顺便说一句,如果您不知道自定义属性表,那么您应该了解一下。请参见【属性页 (Visual C++)】视图-其他窗口-属性窗口,在“属性管理器”中右键单击项目,添加新的项目属性表。 在用户宏下,添加一个宏,例如MyProjectIncludePaths并设置值(在本例中)为

M:; M:\atlmfc\include; W:\um; W:\shared; W:\winrt

--在这个例子中只有49个字符,比默认值短得多。
$(VC_IncludePath); $(WindowsSKD_IncludePath)

该语句经过宏展开后被翻译为

C:\Program Files (x86)\Windows Kits\8.1\Include;C:\Program Files (x86)\Windows Kits\8.1\Include\atlmfc\include;C:\Program Files (x86)\Windows Kits\8.1\Include\um;C:\Program Files (x86)\Windows Kits\8.1\Include\shared;C:\Program Files (x86)\Windows Kits\8.1\Include\winrt

根据我的计算,缺省值为270个字符——即长于260个字符——有人能解释一下吗?
在项目的属性页(即非自定义属性表),例如,在“配置属性-VC++目录”中,我将“包含目录”值更改为“$(MyProjectIncludePaths)”,但实际上,您可以在自定义属性表页面(如果已创建)中转到“C/C++-常规”,并将“$(MyProjectIncludePaths)”添加到“其他包含目录”中。
除了继承的270个字符路径之外,我还能够在“其他包含目录”下添加一些合理长度的路径。也许“其他包含目录”有其自己的长度限制(?)。

0

使用此选项将所有子目录包含在包含路径中

${workspaceFolder}
${workspaceFolder}/**

这是针对 Visual Studio Code 的 launch.json 文件配置,而他要求的是 Visual Studio。在这里,workspaceFolder 将会是 $(SolutionDir) 或者类似的内容,具体取决于项目的架构。 - NoxFly

0

我认为使用递归搜索包含文件会带来比解决问题更多的问题,例如包含错误的文件或版本。毕竟,在设置项目时,您必须定义正确的目录。


7
错误。递归搜索是经典的 Macintosh 开发环境(如 CodeWarrior)中的默认设置。它们有一个简单的惯例,即在目录周围使用括号将其跳过自动包含,因此您必须添加特定路径。这使得包含列表非常简单,我一直在 Windows 上想念它。 - Andy Dent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接