编译器警告(等级 4,关闭)C4464

相对 include 路径包含“..”

#include 指令具有包含父目录说明符的路径(.. 路径段)。

备注

在 Visual Studio 2015 Update 1 及更高版本中,如果启用编译器,可以检测包含父目录路径段 (..) 的 #include 指令,并发出警告。 有时会编写代码,使用父目录相对路径从外部库包含标头。 在源文件中指定这些父目录相对标头路径时会产生风险:可以通过包含违背程序员意图的头文件来编译程序。 对于其他开发人员的生成环境而言,此类相对路径可能是无法移植的。

与上述情况不同,我们建议在生成环境中指定此类标头的路径,例如在 INCLUDE 环境变量中或在 /I(附加包含目录)编译器选项的参数中指定。 在 Visual Studio IDE 中,可以在项目的“配置属性”>“C/C++”>“常规”属性页中的“附加包含目录”属性中设置此类路径。 尽管没有具体警告,但我们还建议不要使用父目录路径段来指定项目的包含目录。

警告 C4464 是 Visual Studio 2015 Update 1 中的新功能,默认处于关闭状态。 使用 /Wall 将启用默认情况下禁用的所有警告。 使用 /wN4464 将 C4464 启用为级别 N 警告(其中 N 为 1 到 4)。 有关详细信息,请参阅默认关闭的编译器警告。 若要详细了解如何禁用特定编译器版本或更高版本中引入的警告,请参阅按编译器版本列出的编译器警告

示例

当启用 C4464 或指定 /Wall 选项时,在 #include 指令中使用 .. 路径段的源代码文件会触发此警告。

在此示例中,项目源位于 C:\project\source 中,而外部库的头文件位于 C:\other_lib\headers中:

// C:\project\source\C4464.cpp
// Compile by using: cl /w14464 C4464.cpp
#include "..\..\other_lib\headers\other.h"          // C4464
#include "..\..\other_lib\headers\extras\nested.h"  // C4464
// . . .

若要解决此问题,请将路径 C:\other_lib\headers 添加到项目的包含目录。 然后更改源以包含头文件(作为外部标头):

// C:\project\source\C4464b.cpp
// Compile by using: cl /w14464 /I"C:\other_lib\headers" C4464b.cpp
#include <other.h>  // OK
#include <extras\nested.h>  // OK
// . . .