編譯器警告 (層級 4, 關閉) C4464
relative include path contains '..'
指示 #include
詞的路徑包含父目錄規範( ..
路徑區段)。
備註
在 Visual Studio 2015 Update 1 和更新版本中,如果啟用,編譯器可以偵測併發出包含父目錄路徑區段的指示詞警告 #include
。 ..
程式碼有時會撰寫,使用父目錄相對路徑來包含外部程式庫的標頭。 在原始程式檔中指定這些父目錄相對標頭路徑時,會產生風險:程式可以藉由包含與程式設計人員想要的不同標頭檔來編譯。 這些相對路徑可能無法移植到其他開發人員的建置環境。
相反地,建議您在建置環境中指定這類標頭的路徑,例如 INCLUDE
環境變數或參數中的 /I
(其他 include 目錄) 編譯器選項。 在 Visual Studio IDE 中,您可以在專案的 [組態屬性 > C/C++ > 一般 ] 屬性頁面中,于 [其他包含目錄 ] 屬性中 設定路徑。 雖然沒有特定的警告,但是當您指定專案的 Include 目錄時,我們也不建議使用父目錄路徑區段。
Visual Studio 2015 Update 1 中的警告 C4464 是新的,且預設為關閉。 使用 /Wall
來啟用預設關閉的所有警告。 使用 /wN4464
來啟用 C4464 作為層級 N
警告(其中 N
為 1-4)。 如需詳細資訊,請參閱 預設 關閉的編譯器警告。 如需如何停用特定編譯器版本或之後所引進警告的資訊,請參閱 編譯器版本的 編譯器警告。
範例
在 指示詞中使用 ..
路徑區段的 #include
原始程式碼檔案可以在啟用 C4464 或指定 選項時 /Wall
觸發此警告。
在此範例中,專案來源位於 , 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
新增至專案的 include 目錄。 然後,將來源變更為包含標頭檔做為外部標頭:
// 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
// . . .