我必须包含许多头文件,它们位于不同的子目录中。在 Visual Studio(我使用的是 2005 版)中有没有办法设置一个包含路径,Visual Studio 也会在子目录中搜索头文件?
5 回答
从设计的角度来看,在 Visual Studio 设置中设置文件夹搜索路径来修复包含问题通常不是一个好主意。您的代码对于具有不同目录布局的不同机器的可移植性会降低。
我的建议是确定您的代码组织,以便子目录的相对路径(相对于您的包含代码)是固定的:
- 将“基本文件夹”添加到项目中(项目属性 -> 配置属性 -> C/C++ -> 附加包含目录,“附加包含目录”)
- 将子目录添加到#include 语句,即
#include "subdirectory/somefile.h"
。
这具有额外的好处,即能够查看解决方案中的哪个文件夹包含该文件 - 当您试图找到自己的方式或试图找出文件的用途时,这通常是有用的信息。
我们还没有找到在 Visual Studio 中设置递归文件夹搜索的方法(尽管 Xcode 设置和使用它们没有问题)。我们所做的是列出文件中的所有目录,并在 C/C++ 命令行附加选项中指定该文件:
@"IncludeFolders.rsp"
我们很少使用递归搜索发现问题,尽管一次意外包含 ``/'' 确实使事情变慢了一点。
我发现在大多数情况下,包括在 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++)。 VIEW-Other Windows-Property Window,在Property manager中右键项目,Add a New Project Properties Sheet。在User Macros下,添加一个宏,例如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 个字符——有人能解释一下吗?
在项目的属性页(即不是自定义属性表)中,在我的示例中,我去了Configuration Properties-VC++ Directories并将Include Directories值更改为$(MyProjectIncludePaths),但实际上你会去(在你的如果您创建了一个自定义属性表页面)C/C++-General并将$(MyProjectIncludePaths)添加到Additional Include Directories。
除了继承的 270 个字符路径之外,我还能够在Additional Include Directories下添加一些合理长度的路径。也许附加包含目录有自己的长度限制(?)。
我相信使用递归搜索包含文件会导致比它以错误文件或包含错误版本的形式解决的问题多得多。毕竟,您必须在设置项目时定义一次正确的目录。
在包含路径中使用它来包含所有子目录
${workspaceFolder}
${workspaceFolder}/**