컴파일러 경고(수준 4, 해제) C4464

상대 포함 경로에는 '..'가 포함됩니다.

#include 지시문에는 부모 디렉터리 지정자(경로 세그먼트)가 포함된 경로가 .. 있습니다.

설명

Visual Studio 2015 업데이트 1 이상 버전에서 사용하도록 설정된 경우 컴파일러는 부모 디렉터리 경로 세그먼트(..)를 포함하는 지시문에 대한 #include 경고를 검색하고 실행할 수 있습니다. 때로는 부모 디렉터리 상대 경로를 사용하여 외부 라이브러리의 헤더를 포함하는 코드가 작성되기도 합니다. 이러한 부모 디렉터리 상대 헤더 경로가 원본 파일에 지정되면 위험이 발생합니다. 프로그래머가 의도한 것과 다른 헤더 파일을 포함하여 프로그램을 컴파일할 수 있습니다. 이러한 상대 경로는 다른 개발자의 빌드 환경에 이식할 수 없습니다.

대신 환경 변수 또는 (추가 포함 디렉터리) 컴파일러 옵션에 INCLUDE 대한 매개 변수와 같이 빌드 환경에서 이러한 헤더의 /I 경로를 지정하는 것이 좋습니다. Visual Studio IDE에서 프로젝트의 구성 속성>C/C++>일반 속성 페이지의 추가 포함 디렉터리 속성에서 경로를 설정할 수 있습니다. 특정 경고는 없지만 프로젝트의 포함 디렉터리를 지정할 때는 부모 디렉터리 경로 세그먼트를 사용하지 않는 것이 좋습니다.

경고 C4464는 Visual Studio 2015 업데이트 1의 새로운 기능이며 기본적으로 꺼져 있습니다. 기본적으로 꺼져 있는 모든 경고를 사용하도록 설정하는 데 사용합니다 /Wall . C4464를 수준 N 경고(여기서 N 1-4)로 사용하도록 설정하는 데 사용합니다/wN4464. 자세한 내용은 기본적으로 꺼져 있는 컴파일러 경고를 참조하세요. 특정 컴파일러 버전에서 또는 이후에 도입된 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.

예시

지시문에서 #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
// . . .