コンパイラの警告 (レベル 4、オフ) C4464
相対インクルード パスに '..' が含まれています
#include
ディレクティブには、親ディレクトリ指定子 (..
パス セグメント) を含むパスがあります。
解説
Visual Studio 2015 Update 1 以降のバージョンでは、有効になっている場合、コンパイラは親ディレクトリ パス セグメント (..
) を含む#include
ディレクティブを検出して警告を発行できます。 外部ライブラリのヘッダーを含めるために、親ディレクトリの相対パスを使用するコードが記述される場合があります。 これらの親ディレクトリ相対ヘッダー パスがソース ファイルで指定されると、リスクが発生します。プログラムは、プログラマが意図したとは異なるヘッダー ファイルを含めることでコンパイルできます。 これらの相対パスは、他の開発者のビルド環境に移植できない場合があります。
代わりに、ビルド環境でこのようなヘッダーへのパスを指定することをお勧めします。たとえば、 INCLUDE
環境変数や、 /I
のパラメーター (追加インクルード ディレクトリ)、コンパイラ オプション 。 Visual Studio IDE では、プロジェクトの Configuration Properties>C/C++>General プロパティ ページの Additional Include Directories プロパティでパスを設定できます。 具体的な警告はありませんが、プロジェクトのインクルード ディレクトリを指定するときに、親ディレクトリ パス セグメントを使用することもお勧めしません。
警告 C4464 は Visual Studio 2015 Update 1 の新機能であり、既定ではオフになっています。 既定でオフになっているすべての警告を有効にするには、 /Wall
を使用します。 /wN4464
を使用して C4464 を警告レベルN
有効にします (N
は 1 から 4)。 詳細については、「既定で無効になっているコンパイラ警告」を参照してください。 特定のコンパイラ バージョンで、またはその後に発生する警告を無効にする方法については、「コンパイラ バージョン別の Compiler の警告を参照してください。
例
#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
パスを追加します。 次に、ソースを変更して、ヘッダー ファイルを外部ヘッダーとして含めます。
// 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
// . . .