[VC] #pragma warning

#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )

컴파일러 경고 메시지 관련 동작에 대한 선택적 수정을 허용해준다.
경고-지시어(warning-specifier)는 다음의 것들 가운데 하나일 수 있다.


경고-지시어의 의미

once
지정한 메시지(들)을 오직 한 번만 표시한다.

default
경고 동작을 그것의 디폴트값으로 재설정(reset)한다. 이것은 디폴트로 꺼져 있는 경고를 켜는 효과도 가지고 있다. 이제 그 경고의 디폴트(문서에 기록된) 수준에서 해당 경고가 발생될 것이다.

좀 더 자세한 정보를 원한다면, 디폴트로 꺼져 있는 컴파일러 경고들을 보라.
 
1, 2, 3, 4
지정한 경고(들)에 대해 주어진 수준을 적용한다. 이것 역시 디폴트로 꺼져 있는 경고를 켜는 효과를 가지고 있다.

disable
지정한 경고 메시지(들)를 발생되지 않도록 한다.

error
지정한 경고들을 에러로 보고한다.


경고-숫자-리스트(warning-number-list)는 어떤 경고 숫자들이라도 포함할 수 있다. 다음처럼 같은 pragma 지시문안에서 여러 옵션들을 지정할 수 있다:


#pragma warning( disable : 4507 34; once : 4385; error : 164 )

이것은 기능적으로 다음과 동등하다:


#pragma warning( disable : 4507 34 )  // 경고 메시지 4507과 4034를 끈다(disable).
#pragma warning( once : 4385 )         // 경고 4385를 한 번만 발생시킨다.
#pragma warning( error : 164 )           // 경고 4164를 에러로 보고한다.

컴파일러는 0~999 사이의 경고 숫자에 4000을 더한다는 점을 주의하라.


4699 보다 큰 경고 숫자들(코드 생성과 관련있다)에 대해서, 경고 pragma는 함수 정의 외부에서만 효과가 있다. 따라서, 경고 pragma가 4699보다 큰 경고 숫자를 함수 안에서 사용할 경우 그것은 무시된다는 뜻이다. 다음의 예는 코드-생성 경고 메시지 발생을 끄고(disable), 복원하는(restore) 경고 pragma들의 올바른 위치를 보여준다:

int a;
#pragma warning( disable : 4705 )
void func()
{
    a;
}
#pragma warning( default : 4705 )

함수 몸체 안에서는, 마지막 경고 pragma 설정이 전체 함수에 대해 영향을 미친다는 점을 주의하라.

경고 pragma는 다음과 같은 구문도 지원한다:


#pragma warning( push [ ,n ] )

#pragma warning( pop )


여기서, n은 경고 수준(1~4)을 나타낸다.

pragma warning( push )는 모든 경고들에 대한 현재 경고 상태를 저장한다. pragma warning( push, n)는 모든 경고들에 대한 현재 경고 상태를 저장하고, 전역 경고 수준(global warning level)을 n으로 설정한다.

pragma warning( pop )은 스택에 push된 마지막 경고 상태를 pop한다. push와 pop사이의 어떠한 경고 상태 변화라도 취소된다(be undone). 다음 예를 살펴 보자:


#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
// 어떤 코드
#pragma warning( pop )

이 코드의 마지막에서, pop은 4705, 4706, 4707을 포함한 모든 경고들의 상태를 코드의 시작 지점의 상태로 복원한다.

당 신이 헤더 파일을 작성한다고 할 때, 그 헤더 파일의 사용자가 설정하는 경고 상태 변화가 당신의 헤더를 적절히 컴파일되지 못하게 하는 것을 막기 위해서, push와 pop을 사용할 수 있다. 헤더의 시작 부분에 push를 쓰고, 마지막에 pop을 써라. 예를 들어, 경고 수준 4에서는 깨끗하게(cleanly) 컴파일되지 않는 헤더가 있다고 가정해 보자. 다음 코드는 경고 수준을 3으로 변경하고, 헤더의 마지막에서 원래 경고 수준으로 복원한다.


#pragma warning( push, 3 )
// 선언/정의
#pragma warning( pop )

경고를 억제하는 컴파일러 옵션에 대해서는 /FI와 /w를 보라.


[출처: http://techmania.egloos.com/1862127]

위로 스크롤