기본적으로 해제되어 있는 컴파일러 경고

컴파일러는 대부분의 개발자가 유용하지 않으므로 기본적으로 꺼져 있는 경고를 지원합니다. 경우에 따라 스타일 선택에 대해 경고하거나 이전 코드의 일반적인 관용구에 대해 경고합니다. 다른 경고는 언어에 대한 Microsoft 확장 사용에 관한 것입니다. 일부 경고는 프로그래머가 잘못된 가정을 하는 영역을 나타내며, 이로 인해 예기치 않거나 정의되지 않은 동작이 발생할 수 있습니다. 이러한 경고를 모두 사용하도록 설정하면 일부 경고가 라이브러리 헤더에 여러 번 나타날 수 있습니다. C 런타임 라이브러리 및 C++ 표준 라이브러리는 경고 수준에서 /W4만 경고를 내보내지 않습니다.

기본적으로 꺼져 있는 경고 사용

다음 옵션 중 하나를 사용하여 일반적으로 꺼져 있는 경고를 사용하도록 설정할 수 있습니다.

  • #pragma warning(default :warning_number)

    지정된 경고(warning_number)는 기본 수준에서 사용하도록 설정됩니다. 경고 설명서에 경고의 기본 수준이 포함되어 있습니다.

  • #pragma warning(:warning_level warning_number)

    지정된 경고(warning_number)는 지정된 수준(warning_level)에서 사용하도록 설정됩니다.

  • /Wall

    /Wall은 기본적으로 해제되어 있는 모든 경고가 사용되게 만듭니다. 이 옵션을 사용하는 경우 이 옵션을 사용하여 /wd 개별 경고를 끌 수 있습니다.

  • /wLnnnn

    이 옵션은 수준 L에서 nnnn 경고를 사용하도록 설정합니다.

기본적으로 꺼져 있는 경고

Visual Studio 2015 이상 버전

Visual Studio 2015 이상 버전에서는 기본적으로 다음 경고가 꺼져 있습니다.

Warning 메시지
C4061 (수준 4) 열거형 '열거형' 스위치의 열거자 'identifier'는 사례 레이블에 의해 명시적으로 처리되지 않습니다.
C4062 (수준 4) 열거형 '열거형' 스위치의 열거자 'identifier'는 처리되지 않습니다.
C4165 (수준 1) 'HRESULT'가 'bool'로 변환되고 있습니다. 당신은 이것이 당신이 원하는 것입니다 확신?
C4191 (수준 3) 'operator': 'type_of_expression'에서 'type_required'으로 안전하지 않은 변환
C4242 (수준 4) 'identifier': 'type1'에서 'type2'로 변환, 데이터 손실 가능성
C4254 (수준 4) 'operator': 'type1'에서 'type2'로 변환, 데이터 손실 가능
C4255 (수준 4) 'function': 함수 프로토타입이 지정되지 않음: '()'을 '(void)'로 변환
C4263 (수준 4) 'function': 멤버 함수는 기본 클래스 가상 멤버 함수를 재정의하지 않습니다.
C4264 (수준 1) 'virtual_function': 기본 'class'의 가상 멤버 함수에 사용할 수 있는 재정의가 없습니다. 함수가 숨겨집니다.
C4265 (수준 3) 'class': 클래스에는 가상 함수가 있지만 소멸자가 가상이 아닙니다.
C4266 (수준 4) 'function': 기본 'type'의 가상 멤버 함수에 사용할 수 있는 재정의가 없습니다. 함수가 숨겨집니다.
C4287 (수준 3) 'operator': 부호 없는/음수 상수 불일치
C4289 (수준 4) 비표준 확장 사용: 'var' : for-loop에 선언된 루프 제어 변수가 for-loop 범위 외부에서 사용됩니다.
C4296 (수준 4) 'operator': 식은 항상 false입니다.
C4339 (수준 4) 'type': CLR 메타 데이터에서 검색된 정의되지 않은 형식의 사용 - 이 형식을 사용하면 런타임 예외가 발생할 수 있습니다.
C4342 (수준 1) 동작 변경: 'function'이 호출되었지만 이전 버전에서 멤버 연산자가 호출되었습니다.
C4350 (수준 1) 동작 변경: 'member2' 대신 호출된 'member1'
C4355 'this' : 기본 멤버 이니셜라이저 목록에서 사용되었습니다.
C4365 (수준 4) 'action': 'type_1'에서 'type_2'로 변환, 부호 있음/서명되지 않은 불일치
C4370(수준 3) 압축 기능이 향상되어 이전 버전의 컴파일러에서 클래스 레이아웃이 변경되었습니다.
C4371 (수준 3) 'class-name': 멤버 'member'의 더 나은 압축으로 인해 클래스 레이아웃이 이전 버전의 컴파일러에서 변경되었을 수 있습니다.
C4388 (수준 4) signed 또는 unsigned가 일치하지 않습니다.
C4412 (수준 2) 'function': 함수 서명에 'type' 형식이 포함되어 있습니다. C++ 개체는 순수 코드와 혼합 또는 네이티브 간에 전달하기에 안전하지 않습니다.
C4426(수준 1) 헤더를 포함한 후 변경된 최적화 플래그는 #pragma optimize() 14.1 때문일 수 있습니다.
C4435 (수준 4) 'class1': 가상 기반 'class2'로 인해 /vd2 아래의 개체 레이아웃이 변경됩니다.
C4437 (수준 4) 가상 베이스 'class1'에서 'class2'로의 dynamic_cast 일부 컨텍스트에서 실패할 수 있습니다.
C4444(수준 3) 최상위 수준 '__unaligned'은 이 컨텍스트에서 구현되지 않습니다.
C4464 (수준 4) 상대 포함 경로에는 '..'가 포함됩니다.
C4471 (수준 4) 범위가 지정되지 않은 열거형의 전달 선언에는 기본 형식(int assumed) Perm이 있어야 합니다.
C4472(수준 1) 'identifier'는 네이티브 열거형입니다. 액세스 지정자(private/public)를 추가하여 관리되는 열거형을 선언합니다.
C4514 (수준 4) 'function': 참조되지 않은 인라인 함수가 제거되었습니다.
C4536 (수준 4) 'type name': type-name이 'limit' 문자의 메타 데이터 제한을 초과합니다.
C4545 (수준 1) 쉼표 앞의 식이 인수 목록이 없는 함수로 계산됩니다.
C4546 (수준 1) 쉼표 앞의 함수에 인수 목록이 없습니다.
C4547 (수준 1) 'operator': 쉼표 앞의 연산자는 효과가 없습니다. 부작용이 있는 예상 연산자
C4548 (수준 1) 쉼표 앞의 식은 의미 없는 식입니다. 파생 작업이 있는 식이어야 합니다.
C4549 (수준 1) 'operator1': 쉼표 앞의 연산자는 효과가 없습니다. 'operator2'를 의도했나요?
C4555 (수준 1) 식이 효과가 없습니다. 파생 작업이 있는 식이어야 합니다.
C4557 (수준 3) '__assume'에 효과 'effect'가 포함되어 있습니다.
C4571 (수준 4) informational: catch(...) 의미 체계가 Visual C++ 7.1 이후 변경됨; SEH(구조적 예외)가 더 이상 catch되지 않음
C4574(수준 4) 'identifier'는 '0'으로 정의됩니다. '#if 식별자'를 사용하시겠습니까?
C4577 (수준 1) 'noexcept'은(는) 예외 처리 모드를 지정하지 않고 사용되며 예외에 대한 종료는 보장되지 않습니다. /EHsc 지정
C4582(수준 4) 'type': 생성자가 암시적으로 호출되지 않음
C4583(수준 4) 'type': 소멸자가 암시적으로 호출되지 않음
C4587(수준 1) 'anonymous_structure': 동작 변경: 생성자가 더 이상 암시적으로 호출되지 않습니다.
C4588(수준 1) 'anonymous_structure': 동작 변경: 소멸자가 더 이상 암시적으로 호출되지 않습니다.
C4596 (수준 4) 'identifier': 멤버 선언 14.3Perm에서 잘못된 정규화된 이름
C4598(수준 1 및 수준 3) '#include "header"': 미리 컴파일된 헤더의 헤더 번호 헤더 번호 가 해당 위치 14.3의 현재 컴파일과 일치하지 않습니다.
C4599(수준 3) 'optionpath': 명령줄 인수 번호 arg_number 미리 컴파일된 헤더 14.3과 일치하지 않습니다.
C4605(수준 1) 현재 명령줄에 지정되었지만 미리 컴파일된 헤더를 빌드할 때 지정되지 않은 '/D매크로'입니다.
C4608 (수준 3) 'union_member'은 이미 이니셜라이저 목록 'union_member' Perm의 다른 조합원에 의해 초기화되었습니다.
C4619 (수준 3) #pragma 경고: 경고 번호 'number' 없습니다.
C4623 (수준 4) 'derived class': 기본 클래스의 기본 생성자에 액세스할 수 없으므로 기본 생성자를 생성할 수 없습니다.
C4625 (수준 4) 'derived class': 기본 클래스의 복사 생성자에 액세스할 수 없으므로 복사 생성자를 생성할 수 없습니다.
C4626 (수준 4) 'derived class': 기본 클래스의 대입 연산자에 액세스할 수 없으므로 대입 연산자를 생성할 수 없습니다.
C4628 (수준 1) -Ze에는 digraph가 지원되지 않습니다. 문자 시퀀스 'digraph'가 'char'에 대한 대체 토큰으로 해석되지 않음
C4640 (수준 3) 'instance': 로컬 정적 개체의 생성은 스레드로부터 안전하지 않습니다.
C4643(수준 4) C++ 표준에서는 네임스페이스 std에서 정방향 선언 'identifier'를 사용할 수 없습니다. 15.8
C4647(수준 3) 동작 변경: 이전 버전에서 __is_pod(형식)의 값이 다릅니다.
C4654(수준 4) 미리 컴파일된 헤더 줄을 포함하기 전에 배치된 코드는 무시됩니다. 미리 컴파일된 헤더에 코드를 추가합니다. 14.1
C4668 (수준 4) 'symbol'은 전처리기 매크로로 정의되지 않고 '지시문'의 경우 '0'으로 대체됩니다.
C4682 (수준 4) 'symbol': 방향 매개 변수 특성이 지정되지 않고 기본값은 [in]입니다.
C4686 (수준 3) '사용자 정의 형식': 동작 변경 가능, UDT 반환 호출 규칙 변경
C4692 (수준 1) 'function': 프라이빗이 아닌 멤버의 서명에 어셈블리 프라이빗 네이티브 형식 'native_type'이 포함되어 있습니다.
C4710 (수준 4) 'function': 인라인되지 않은 함수
C4738 (수준 3) 32비트 float 결과를 메모리에 저장하면 성능이 저하될 수 있습니다.
C4746 'expression'의 volatile 액세스는 /volatile:<iso|ms> 설정의 적용을 받습니다. __iso_volatile_load/store 내장 함수를 사용하는 것이 좋습니다.
C4749(수준 4) 조건부 지원: 비표준 레이아웃 형식 'type'에 적용된 offsetof
C4767(수준 4) 섹션 이름 'symbol'이 8자보다 길어 링커에서 잘립니다.
C4774(수준 4) 'string': 인수 번호 에 필요한 형식 문자열이 문자열 리터럴이 아닙니다.
C4777(수준 4) 'function': 형식 문자열 'string'에는 'type1' 형식의 인수가 필요하지만 variadic 인수 번호 에는 'type2' 형식이 있습니다.
C4786(수준 3) 'symbol': 개체 이름이 디버그 정보의 'number' 문자로 잘렸습니다.
C4800 (수준 4) 'type'에서 bool로의 암시적 변환입니다. 가능한 정보 손실 16.0
C4820 (수준 4) 'member_name' 생성 후 추가된 '바이트' 바이트 패딩
C4822 (수준 1) 'member': 로컬 클래스 멤버 함수에 본문이 없습니다.
C4826(수준 2) 'type1'에서 'type2'로의 변환은 기호 확장입니다. 이로 인해 예기치 않은 런타임 동작이 발생할 수 있습니다.
C4837(수준 4) trigraph 검색됨: '??character'가 'character'로 대체됨
C4841 (수준 4) 비표준 확장 사용: offsetof에 사용되는 복합 멤버 지정자
C4842(수준 4) 여러 상속을 사용하여 형식에 적용된 'offsetof'의 결과는 컴파일러 릴리스 간에 일관성이 보장되지 않습니다.
C4866 (수준 4) 'file(줄 번호)' 컴파일러는 연산자 호출에 대해 왼쪽에서 오른쪽 평가 순서를 적용하지 않을 수 있습니다.
C4868 (수준 4) 'file(line_number)' 컴파일러는 중괄호가 있는 초기화 목록에서 왼쪽에서 오른쪽 평가 순서를 적용할 수 없습니다.
C4905 (수준 1) 와이드 문자열 리터럴을 'LPSTR'로 캐스팅했습니다.
C4906 (수준 1) 문자열 리터럴을 'LPWSTR'로 캐스팅했습니다.
C4917 (수준 1) 'declarator': GUID는 클래스, 인터페이스 또는 네임스페이스에만 연결할 수 있습니다.
C4928 (수준 1) 복사 초기화가 잘못되었습니다. 사용자 정의 변환이 암시적으로 두 번 이상 적용되었습니다.
C4931 (수준 4) number비트 포인터에 대한 형식 라이브러리를 빌드했다고 간주합니다.
C4946 (수준 1) 관련 클래스 사이에 사용되는 reinterpret_cast: 'class1' 및 'class2'
C4962 'function': 최적화로 인해 프로필 데이터가 일관성이 없어지므로 프로필 기반 최적화를 사용하지 않도록 설정했습니다.
C4986 (수준 4) 'symbol': 예외 사양이 이전 선언과 일치하지 않습니다.
C4987(수준 4) 비표준 확장 사용: 'throw (...)'
C4988(수준 4) 'symbol': 클래스/함수 범위 외부에서 선언된 변수
C5022 'type': 지정된 여러 이동 생성자
C5023 'type': 지정된 여러 이동 할당 연산자
C5024(수준 4) 'type': 이동 생성자가 암시적으로 삭제됨으로 정의되었습니다.
C5025(수준 4) 'type': 이동 할당 연산자가 암시적으로 삭제됨으로 정의되었습니다.
C5026(수준 1 및 수준 4) 'type': 이동 생성자가 암시적으로 삭제됨으로 정의되었습니다.
C5027(수준 1 및 수준 4) 'type': 이동 할당 연산자가 암시적으로 삭제됨으로 정의되었습니다.
C5029(수준 4) 비표준 확장 사용: C++의 맞춤 특성은 변수, 데이터 멤버 및 태그 형식에만 적용됩니다.
C5031(수준 4) #pragma 경고(pop): 다른 파일 14.1에서 푸시된 경고 상태가 일치하지 않는 것 같습니다.
C5032(수준 4) 해당 #pragma 경고(pop) 14.1이 없는 #pragma 경고(푸시) 가 검색됨

Visual Studio 2017 이상 버전

Visual Studio 2017 이상 버전에서는 다음 경고가 기본적으로 꺼져 있습니다.

Warning 메시지
C5034 내장 '내장 함수'를 사용하면 함수 함수 이름이 게스트 코드 15.3으로 컴파일됩니다.
C5035 기능 'feature'를 사용하면 함수 함수 이름이 게스트 코드 15.3으로 컴파일됩니다.
C5036(수준 1) /hybrid:x86arm64 'type1'을 'type2' 15.3으로 컴파일할 때 varargs 함수 포인터 변환
C5038 (수준 4) 데이터 멤버 'member1'이(가) 데이터 멤버 'member2' 15.3 이후 초기화됩니다.
C5039(수준 4) 'function': 포인터 또는 잠재적으로 throw 함수에 대한 참조는 아래 -EHc의 extern C 함수에 전달됩니다. 이 함수가 예외를 throw하는 경우 정의되지 않은 동작이 발생할 수 있습니다. 15.5
C5041(수준 4) 'member-name': constexpr 정적 데이터 멤버에 대한 아웃 오브 라인 정의는 필요하지 않으며 C++17에서는 더 이상 사용되지 않습니다. 15.2
C5042(수준 3) 'function': 블록 범위의 함수 선언은 표준 C++에서 '인라인'으로 지정할 수 없습니다. 'inline' 지정자 15.5를 제거합니다.
C5045 /Qspectre 스위치가 15.7을 지정 한 경우 컴파일러는 메모리 로드에 대한 Spectre 완화를 삽입합니다.

Visual Studio 2019 이상 버전

Visual Studio 2019 이상 버전에서는 다음과 같은 경고가 기본적으로 꺼져 있습니다.

Warning 메시지
C5052(수준 3) '키워드(keyword)-name' 키워드는 C++ 버전에서 도입되었으며 'option' 명령줄 옵션' 16.1을 사용해야 합니다.
C5204(수준 3) 가상 함수가 있는 클래스에는 가상이 아닌 간단한 소멸자가 있습니다. 16.5
C5214(수준 4) 휘발성 정규화된 형식의 피연산자에 '키워드(keyword)'을 적용하는 것은 C++20 16.7에서 더 이상 사용되지 않습니다.
C5215(수준 4) 휘발성 정규화된 형식의 함수 매개 변수 'function-parameter'는 C++20 16.7에서 더 이상 사용되지 않습니다.
C5216(수준 4) 'return-type'은 C++20 16.7에서 일시적 정규화된 반환 형식이 더 이상 사용되지 않습니다.
C5217(수준 4) C++20 16.7에서는 volatile를 포함하는 구조적 바인딩 선언이 더 이상 사용되지 않습니다.
C5219(수준 2) 암시적 'type-1'에서 'type-2'로 변환, 데이터 16.7 손실 가능
C5220(수준 4) 'member': 휘발성 정규화된 형식을 가진 비정적 데이터 멤버는 더 이상 이를 암시하지 않습니다.
컴파일러에서 생성된 복사/이동 생성자 및 복사/이동 할당 연산자는 사소한 16.7이 아닙니다.
C5233(수준 4) 명시적 람다 캡처 'identifier'가 사용되지 않음 16.10
C5240(수준 4) 'attribute-name': 이 구문 위치 16.10에서 특성이 무시됩니다.
C5243(수준 1) 'type-name': 불완전한 클래스 'class-name'을 사용하면 ABI 제한 16.10으로 인해 잠재적인 하나의 정의 규칙 위반이 발생할 수 있습니다.
C5245(수준 4) 'function': 내부 링크가 있는 참조되지 않은 함수가 제거되었습니다.
C5246(수준 1) 'member': 하위 개체의 초기화는 중괄호 16.10으로 래핑되어야 합니다.
C5247(수준 1) 섹션 'section-name'은 C++ 동적 초기화를 위해 예약되어 있습니다. 섹션을 수동으로 만들면 C++ 동적 초기화가 방해되며 정의되지 않은 동작 16.11이 발생할 수 있습니다.
C5248(수준 1) 섹션 'section-name'은 C++ 동적 초기화를 위해 예약되어 있습니다. 섹션에 수동으로 배치된 변수는 최적화될 수 있으며 컴파일러에서 생성된 동적 이니셜라이저에 상대적인 순서는 지정되지 않은 16.11입니다.

Visual Studio 2022 이상 버전

Visual Studio 2022 이상 버전에서는 다음과 같은 경고가 기본적으로 꺼져 있습니다.

Warning 메시지
C5249(수준 1) 'enumeration_name' 형식의 'bitfield'에는 지정된 비트 필드 너비를 'bitfield_width'으로 나타낼 수 없는 값이 있는 열거자의 이름이 지정되었습니다. 17.0
C5250(수준 3) 'function_name': 내장 함수가 선언되지 않았습니다. 17.0
C5251(수준 4) 헤더 17.1을 포함한 후 세그먼트 이름이 변경됨
C5254(수준 4) 언어 기능 'terse static assert'에는 컴파일러 플래그 '/std:c++17' 17.1이 필요합니다.
C5256(수준 1) '열거형': 고정된 기본 형식의 열거형을 정의하지 않는 선언은 독립 실행형 선언 17.2로만 허용됩니다.
C5258(수준 4) 이 사용 17.2에는 'symbol'의 명시적 캡처가 필요하지 않습니다.
C5259(수준 4) 'specialized-type': 명시적 특수화에는 'template <>' 17.3이 필요합니다.
C5262 (수준 1, 오류) 암시적 대체는 여기에서 발생합니다. 문이 누락되었 break 나요? 사례 17.4 간에 문이 의도적으로 생략된 경우 break사용 [[fallthrough]]
C5263(수준 4) 임시 개체에서 'std::move'를 호출하면 복사 엘리전 17.4가 방지됩니다.
C5264(수준 4) 'variable-name': 'const' 변수는 17.4를 사용하지 않습니다.
C5266(수준 4) 반환 형식의 'const' 한정자는 17.6에 영향을 주지 않습니다.
C5267 (수준 4) 사용자가 제공한 대입 연산자/복사 생성자 17.7이 있으므로 'type'에 대한 암시적 복사 생성자/할당 연산자의 정의는 더 이상 사용되지 않습니다.

14.1 이 경고는 Visual Studio 2015 업데이트 1부터 사용할 수 있습니다.
14.3 이 경고는 Visual Studio 2015 업데이트 3부터 사용할 수 있습니다.
15.2 이 경고는 Visual Studio 2017 버전 15.2부터 사용할 수 있습니다.
15.3 이 경고는 Visual Studio 2017 버전 15.3부터 사용할 수 있습니다.
15.5 이 경고는 Visual Studio 2017 버전 15.5부터 사용할 수 있습니다.
15.7 이 경고는 Visual Studio 2017 버전 15.7부터 사용할 수 있습니다.
15.8 이 경고는 Visual Studio 2017 버전 15.8부터 사용할 수 있습니다.
16.0 이 경고는 Visual Studio 2019 RTM부터 사용할 수 있습니다.
16.5 이 경고는 Visual Studio 2019 버전 16.5부터 사용할 수 있습니다.
16.7 이 경고는 Visual Studio 2019 버전 16.7부터 사용할 수 있습니다.
16.10 이 경고는 Visual Studio 2019 버전 16.10부터 사용할 수 있습니다.
16.11 이 경고는 Visual Studio 2019 버전 16.11부터 사용할 수 있습니다.
17.0 이 경고는 Visual Studio 2022 버전 17.0부터 사용할 수 있습니다.
17.1 이 경고는 Visual Studio 2022 버전 17.1부터 사용할 수 있습니다.
17.2 이 경고는 Visual Studio 2022 버전 17.2부터 사용할 수 있습니다.
17.3 이 경고는 Visual Studio 2022 버전 17.3부터 사용할 수 있습니다.
17.4 이 경고는 Visual Studio 2022 버전 17.4부터 사용할 수 있습니다.
17.5 이 경고는 Visual Studio 2022 버전 17.5부터 사용할 수 있습니다.
17.6 이 경고는 Visual Studio 2022 버전 17.6부터 사용할 수 있습니다.
17.7 이 경고는 Visual Studio 2022 버전 17.7부터 사용할 수 있습니다.
Perm 컴파일러 옵션이 설정되지 않은 한 /permissive- 이 경고는 꺼집니다.

이전 버전에서 기본적으로 경고 해제

이 경고는 Visual Studio 2015 버전 15.3에서 기본적으로 해제되었으며 Visual Studio 2015 버전 15.5에서 사용하도록 설정되었습니다.

Warning 메시지
C4768 __declspec 링크 사양 이전의 특성은 무시됩니다.

이러한 경고는 Visual Studio 2015 이전 버전의 컴파일러에서 기본적으로 해제되었습니다.

Warning 메시지
C4302 (수준 2) 'conversion': 'type1'에서 'type2'로 잘림
C4311 (수준 1) 'variable': 'type'에서 'type'으로 포인터 잘림
C4312 (수준 1) 'operation': 더 큰 크기의 'type1'에서 'type2'로 변환
C4319 (수준 1) 'operator': 'type1'을 더 큰 크기의 'type2'로 확장하는 0

이 경고는 Visual Studio 2012 이전 버전의 컴파일러에서 기본적으로 해제되었습니다.

Warning 메시지
C4431 (수준 4) 형식 지정자가 없습니다. int로 가정합니다. 참고: C에서는 더 이상 기본 int를 지원하지 않습니다.

참고 항목

warning pragma