/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 .

경고를 사용하거나 사용하지 않도록 설정하고 표시하지 않는 모든 기존 메커니즘은 외부 파일과 외부 파일 모두에서 계속 작동합니다. 예를 들어 pragmawarning 외부 헤더에 대해 설정한 기본 경고 수준을 여전히 재정의할 수 있습니다.

예: 외부 경고 수준 설정

이 샘플 프로그램에는 두 개의 소스 파일 program.cppheader_file.h. 파일이 header_file.hinclude_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 이상:

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>VC++ 디렉터리 속성 페이지를 선택합니다.

  3. 외부 포함 디렉터리 속성을 설정하여 세미콜론으로 구분된 각 경로에 대한 옵션에 /external:I path 해당하는 IDE를 지정합니다.

  4. 구성 속성>C/C++>외부 포함 속성 페이지를 선택합니다.

  5. 속성을 설정합니다.

    • 꺾쇠 괄호에 포함된 파일을 외부-예로 설정하여 옵션을 설정합니다/external:anglebrackets.

    • 외부 헤더 경고 수준을 사용하면 옵션을 설정할 수 있습니다 /external:Wn . 이 값이 프로젝트 경고 수준 또는 기본값 상속으로 설정된 경우 다른 /external 옵션은 무시됩니다.

    • 외부 헤더의 템플릿 진단을 예설정하여 옵션을 설정합니다/external:templates-.

  6. 확인을 선택하거나 적용하여 변경 내용을 저장합니다.

Visual Studio 2019 버전 16.10 이전의 Visual Studio 버전:

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. /experimental:external 추가 옵션 상자에 옵션 및 기타 /external 컴파일러 옵션을 입력합니다.

  4. 확인을 선택하거나 적용하여 변경 내용을 저장합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

* Visual Studio 2019 버전 16.10 이전 버전의 Visual Studio에서 외부 헤더 옵션을 사용하도록 설정하는 옵션을 추가 /experimental:external 합니다.

참고 항목

MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문