/external
(외부 헤더 진단)
/external
컴파일러 옵션을 사용하면 특정 헤더 파일에 대한 컴파일러 진단 동작을 지정할 수 있습니다. "외부" 헤더는 "내 코드만"의 자연스러운 보완입니다. 시스템 파일 또는 변경할 수 없거나 변경할 의도가 없는 타사 라이브러리 파일과 같은 헤더 파일입니다. 이러한 파일은 변경하지 않으므로 컴파일러에서 해당 파일에 대한 진단 메시지를 보는 것이 유용하지 않다고 판단할 수 있습니다. /external
컴파일러 옵션을 사용하면 이러한 경고를 제어할 수 있습니다.
/external
컴파일러 옵션은 Visual Studio 2017 버전 15.6부터 사용할 수 있습니다. Visual Studio 2019 버전 16.10 /external
이전 버전의 Visual Studio에서 옵션을 사용하려면 컴파일러 옵션도 설정 /experimental:external
해야 합니다.
구문
외부 헤더 옵션 사용(16.10 이상에서는 필요하지 않음):
/experimental:external
외부 헤더를 지정합니다.
/external:anglebrackets
/external:env:
var
/external:I
path
진단 동작을 지정합니다.
/external:W0
/external:W1
/external:W2
/external:W3
/external:W4
/external:templates-
인수
/experimental:external
외부 헤더 옵션을 사용하도록 설정합니다. Visual Studio 2019 버전 16.10 이상에서는 이 옵션이 필요하지 않습니다.
/external:anglebrackets
파일이 꺾쇠 괄호(< >
)로 #include <header>
header
묶인 위치에 포함된 모든 헤더를 외부 헤더로 처리합니다.
/external:I
path
외부 헤더를 포함하는 루트 디렉터리를 정의합니다. 모든 재귀 하위 디렉터 path
리는 외부로 간주되지만 컴파일러가 포함 파일을 검색하는 디렉터리 목록에 값만 path
추가됩니다. 사이의 /external:I
공간과 path
선택 사항입니다. 공백을 포함하는 디렉터리를 큰따옴표로 묶어야 합니다. 디렉터리가 절대 경로 또는 상대 경로일 수 있습니다.
/external:env:
var
세미콜론으로 구분된 외부 헤더 디렉터리 목록을 포함하는 환경 변수 var
의 이름을 지정합니다. 외부 포함 파일 목록을 지정하는 데 사용하는 환경 변수(예: INCLUDE
환경 변수)를 사용하는 빌드 시스템에 유용합니다. 또는 . CAExcludePath
/analyze
예를 들어 외부 헤더 디렉터리의 모든 디렉터리를 INCLUDE
한 번에 만들도록 지정할 /external:env:INCLUDE
수 있습니다. 개별 디렉터리를 지정하는 데 사용하는 /external:I
것과 동일하지만 자세한 내용은 훨씬 적습니다. 사이에 var
/external:env:
공백이 없어야 합니다.
/external:Wn
이 옵션은 외부 헤더의 기본 경고 수준을 n
0에서 4까지의 값으로 설정합니다. 예를 들어 /external:W0
외부 헤더에 대한 경고를 효과적으로 해제합니다. 이 옵션을 지정하지 않으면 컴파일러는 다른 /external
옵션에 대해 명령줄 경고 D9007을 실행합니다. 이러한 옵션은 효과가 없으므로 무시됩니다.
이 /external:Wn
옵션은 지시문에 포함된 헤더를 래핑하는 것과 유사한 효과가 있습니다.#pragma warning
#pragma warning (push, 0)
// the global warning level is now 0 here
#include <external_header>
#pragma warning (pop)
/external:templates-
코드에서 인스턴스화된 템플릿에서 외부 헤더가 발생할 때의 경고를 허용합니다.
설명
기본적으로 빌드에 지정한 /Wn
경고 수준은 모든 파일에 적용됩니다. 외부 헤더를 지정하는 옵션은 다른 기본 경고 수준을 적용할 수 있는 파일 집합만 정의합니다. 따라서 외부 헤더를 지정하는 경우 외부 경고 수준을 지정하여 컴파일러 동작을 변경하는 데도 사용합니다 /external:Wn
.
경고를 사용하거나 사용하지 않도록 설정하고 표시하지 않는 모든 기존 메커니즘은 외부 파일과 외부 파일 모두에서 계속 작동합니다. 예를 들어 pragma는 warning
외부 헤더에 대해 설정한 기본 경고 수준을 여전히 재정의할 수 있습니다.
예: 외부 경고 수준 설정
이 샘플 프로그램에는 두 개의 소스 파일 program.cpp
과 header_file.h
. 파일이 header_file.h
include_dir
포함된 디렉터리의 하위 디렉터리에 있습니다 program.cpp
.
원본 파일 include_dir/header_file.h
:
// External header: include_dir/header_file.h
template <typename T>
struct sample_struct
{
static const T value = -7; // W4: warning C4245: 'initializing':
// conversion from 'int' to 'unsigned int', signed/unsigned mismatch
};
원본 파일 program.cpp
:
// User code: program.cpp
#include <header_file.h>
int main()
{
return sample_struct<unsigned int>().value;
}
다음 명령줄을 사용하여 샘플을 빌드할 수 있습니다.
cl /EHsc /I include_dir /W4 program.cpp
예상대로 이 샘플은 다음과 같은 경고를 생성합니다.
program.cpp
include_dir\header_file.h(6): warning C4245: 'initializing': conversion from 'int' to 'const T', signed/unsigned mismatch
with
[
T=unsigned int
]
program.cpp(6): note: see reference to class template instantiation 'sample_struct<unsigned int>' being compiled
헤더 파일을 외부 파일로 처리하고 경고를 표시하지 않으면 이 명령줄을 대신* 사용할 수 있습니다.
cl /EHsc /I include_dir /external:anglebrackets /external:W0 /W4 program.cpp
이 명령줄은 내부 경고를 유지하면서 내부에 header_file.h
경고를 표시하지 않습니다 program.cpp
.
내부 및 외부 경계에 대한 경고
외부 헤더에 대해 낮은 경고 수준을 설정하면 일부 실행 가능한 경고를 숨길 수 있습니다. 특히 사용자 코드의 템플릿 인스턴스화에서 내보낸 경고를 끌 수 있습니다. 이러한 경고는 코드에서 특정 형식에 대한 인스턴스화에서만 발생하는 문제를 나타낼 수 있습니다. (예를 들어 형식 특성 제거 또는 &
.를 적용하는 const
것을 잊은 경우) 외부 헤더에 정의된 템플릿 내의 침묵 경고를 방지하려면 이 /external:templates-
옵션을 사용할 수 있습니다. 컴파일러는 템플릿을 정의하는 파일의 유효 경고 수준과 템플릿 인스턴스화가 발생하는 경고 수준을 모두 고려합니다. 외부 코드 내에서 템플릿이 인스턴스화되면 외부 템플릿 내에서 내보낸 경고가 나타납니다. 예를 들어 이 명령줄은 샘플 코드*의 템플릿 소스에서 경고를 다시 사용하도록 설정합니다.
cl /EHsc /I include_dir /external:anglebrackets /external:W0 /external:templates- /W4 program.cpp
템플릿 코드가 외부 헤더 내에 있더라도 C4245 경고가 출력에 다시 나타납니다.
경고 사용, 사용 안 함 또는 표시 안 함
경고를 사용, 사용 안 함 및 표시하지 않도록 설정하는 모든 기존 메커니즘은 외부 헤더에서 계속 작동합니다. 이 옵션을 사용하기 때문에 경고가 /external:templates-
표시되면 인스턴스화 지점에서 경고를 표시하지 않을 수 있습니다. 예를 들어 샘플에서 다시 /external:templates-
나타나는 경고를 명시적으로 표시하지 않으면 pragma 지시문을 사용합니다 warning
.
int main()
{
#pragma warning( suppress : 4245)
return sample_struct<unsigned int>().value;
}
라이브러리 작성자는 동일한 메커니즘을 사용하여 특정 경고를 적용하거나 특정 수준에서 모든 경고를 적용할 수 있습니다. 이러한 경고가 침묵 /external:Wn
해서는 안 된다고 생각되는 경우. 예를 들어 이 버전의 헤더 파일은 C4245에 오류를 보고하도록 강제로 경고합니다.
// External header: include_dir/header_file.h
#pragma warning( push, 4 )
#pragma warning( error : 4245 )
template <typename T>
struct sample_struct
{
static const T value = -7; // W4: warning C4245: 'initializing': conversion from 'int'
// to 'unsigned int', signed/unsigned mismatch
};
#pragma warning( pop )
라이브러리 헤더를 변경하면 라이브러리 작성자가 지정한 내용 /external:Wn
에 관계없이 이 헤더의 전역 경고 수준이 4인지 확인합니다. 이제 모든 수준 4 이상 경고가 보고됩니다. 라이브러리 작성자는 특정 경고를 헤더에서 한 번만 오류, 비활성화, 표시 안 함 또는 내보내도록 강제할 수도 있습니다. 옵션은 /external
의도적인 선택을 재정의하지 않습니다.
system_header
pragma
#pragma system_header
는 라이브러리 작성기가 특정 헤더를 외부로 표시할 수 있도록 하는 침입 마커입니다. 포함된 #pragma system_header
파일은 명령줄에서 외부로 지정된 것처럼 pragma 지점부터 파일 끝까지 외부로 간주됩니다. 컴파일러는 pragma 다음에 지정된 /external:Wn
경고 수준에서 진단을 내보낸다. 자세한 내용은 pragma를 참조 system_header
하세요.
제한 사항
컴파일러의 백 엔드 코드 생성에서 내보낸 일부 경고는 옵션의 영향을 /external
받지 않습니다. 이러한 경고는 일반적으로 C47XX로 시작하지만 모든 C47XX 경고가 백 엔드 경고는 아닙니다. 를 사용하여 /wd47XX
이러한 경고를 개별적으로 사용하지 않도록 설정할 수 있습니다. 코드 분석 경고는 경고 수준이 없으므로 영향을 받지 않습니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
Visual Studio 2019 버전 16.10 이상:
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.
구성 속성>VC++ 디렉터리 속성 페이지를 선택합니다.
외부 포함 디렉터리 속성을 설정하여 세미콜론으로 구분된 각 경로에 대한 옵션에
/external:I path
해당하는 IDE를 지정합니다.구성 속성>C/C++>외부 포함 속성 페이지를 선택합니다.
속성을 설정합니다.
꺾쇠 괄호에 포함된 파일을 외부 -예로 설정하여 옵션을 설정합니다
/external:anglebrackets
.외부 헤더 경고 수준을 사용하면 옵션을 설정할 수 있습니다
/external:Wn
. 이 값이 프로젝트 경고 수준 또는 기본값 상속으로 설정된 경우 다른/external
옵션은 무시됩니다.외부 헤더의 템플릿 진단을 예로 설정하여 옵션을 설정합니다
/external:templates-
.
확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.
Visual Studio 2019 버전 16.10 이전의 Visual Studio 버전:
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.
구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.
/experimental:external
추가 옵션 상자에 옵션 및 기타/external
컴파일러 옵션을 입력합니다.확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- AdditionalOptions을(를) 참조하세요.
* Visual Studio 2019 버전 16.10 이전 버전의 Visual Studio에서 외부 헤더 옵션을 사용하도록 설정하는 옵션을 추가 /experimental:external
합니다.