編譯程式警告 (層級 4, 關閉) C4464
相對 Include 路徑包含 '..'
指示 #include
詞的路徑包含父目錄規範( ..
路徑區段)。
備註
在 Visual Studio 2015 Update 1 和更新版本中,如果啟用,編譯程式可以偵測併發出包含父目錄路徑區段的指示詞警告#include
。..
程式代碼有時會撰寫,使用父目錄相對路徑來包含外部連結庫的標頭。 在原始程序檔中指定這些父目錄相對標頭路徑時,會產生風險:程式可以藉由包含與程式設計人員想要的不同頭檔來編譯。 這些相對路徑可能無法移植到其他開發人員的建置環境。
相反地,建議您在建置環境中指定這類標頭的路徑,例如 INCLUDE
環境變數或參數中的 /I
(其他 include 目錄) 編譯程式選項。 在 Visual Studio IDE 中,您可以在 [其他 Include Directory] 屬性的 [其他包含目錄] 屬性中,設定專案 [組態屬性>C/C++>General] 屬性頁的路徑。 雖然沒有特定的警告,但是當您指定專案的 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
// . . .