단일 경고 오류 비활성화


115

Visual Studio를 사용하여 cpp 파일에서 단일 경고 줄만 비활성화하는 방법이 있습니까?

예를 들어 예외를 포착하고 처리하지 않으면 오류 4101 (참조되지 않은 지역 변수)이 발생합니다. 해당 함수에서만 이것을 무시하고 그렇지 않으면 컴파일 단위에서보고하는 방법이 있습니까? 지금 #pragma warning (disable : 4101)은 파일 맨 위에 놓았 지만 분명히 전체 장치에 대해 해제됩니다.


19
유형 만 언급하고 예외의 이름을 지정하지 않으면 경고가 표시되지 않습니다. 예 catch (const std::exception& /* unnamed */) {.... }. 질문에 대한 답변은 아니지만 문제를 해결할 수 있습니다.
Sjoerd

답변:


182
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

1
@Cookie : 예, 컴파일러를 통과하는 모든 코드에서 작동합니다.
Matteo Italia

보다 최근의 간결한 답변은 아래 Daniel S either의 답변을 참조하십시오.
Dan Nissenbaum

4
clang이 pragma를 지원하지 않는 것,하지만 당신과 같은 효과를 얻을 수 있습니다 #pragma clang diagnostic push, #pragma clang diagnostic ignored "-Wunused-variable"하고 #pragma clang diagnostic pop. 참조 연타 사용자 설명서의 "제어 Diagnositics 통해하는 pragma를"
rampion

이 기능을 자주 사용하지 않기 때문에이 기능을 사용하면 일반적으로 구문을 상기시키기 위해이 페이지를 보게됩니다. 업데이트되지 않을 수있는 더 이상 사용되지 않는 함수에 대한 호출 주위에두면 경고가 컴파일러 목록에서 나를 괴롭히지 않게됩니다.
데이비드 A. 그레이

Visual Studio의 경우 명령 줄 인수는 /wd4101. :플래그와 숫자 사이 에는 정상이 없으며 쉼표로 구분 된 숫자 목록을 수행 할 수 없습니다. 다른 컴파일러의 경우 대신 그럴 있습니다 /nowarn:4101.
Jesse Chisholm

89

한 줄의 코드에서만 경고를 표시하지 않으려면 suppress 경고 지정자를 사용할 수 있습니다 .

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

한 줄의 코드의 경우 다음을 작성하는 것과 동일하게 작동합니다.

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

8
굉장히 유용하다! 불행히도 경고를 생성하는 헤더를 포함하는 단일 행에서는 작동하지 않습니다.
Marko Popovic

2
@MarkoPopovic : suppress지정 자는 사전 처리 된 단일 코드 줄에서 작동합니다. 다음 행 #pragma warning(suppress: ...)#include지시문 (매개 변수가 참조하는 파일을 현재 컴파일 단위로 확장) 인 경우 효과는 해당 파일의 첫 번째 행에만 적용됩니다. 경고는 컴파일러에 의해 생성되기 때문에 이것은 분명해야합니다. 컴파일러는 사전 처리 된 코드에서 작동합니다.
IInspectable

@IInspectable이 경우 후 처리 된 코드 줄 이라고 부릅니다 . 전 처리됨 은 아직 전처리기에 의해 번역되지 않았 음을 의미합니다.
void.pointer

2
@voi : "-ed" 어미는 과거 분사를 의미합니다 . 과거에 어떤 것이 끝났다는 것을 표현하는 데 사용됩니다. "전처리" 라인이 완전히 처리 된 라인이다.
IInspectable 2019

29

#pragma 푸시 / 팝은 종종 이러한 종류의 문제에 대한 해결책이지만이 경우 참조되지 않은 변수를 제거하지 않는 이유는 무엇입니까?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

6
이것은 질문에 대한 답이 아닙니다. 물론 이것은 OP의 문제를 해결할 수 있지만 유사한 질문으로 미래의 독자에게 도움이되지는 않을 것입니다. "내 코드의 특정 부분에 대한 특정 경고를 어떻게 해제합니까?"
Sjoerd

1
@Sjoerd : 다른 사람들이 검색 할 수있는 "공식적인 질문"에 이미 세 사람이 대답 했으므로 대신 줄 사이를 읽고 그의 실제 문제를 해결하려고했습니다 (댓글 1 분 후 도착 :P).
Matteo Italia

11
@Sjoerd는 미래의 독자 로서이 답변이 실제로 도움이되었음을 증명합니다.
Mołot 2015

2
@ Mołot : 과거 작가로서 도움이되어 기쁩니다. =)
마테오 이탈리아

9

사용 #pragma warning ( push )#pragma warning ( disable ), 다음 코드를 삽입 한 후 사용하십시오 #pragma warning ( pop )같은 설명 여기 :

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

8

예:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

이 pragma는 Visual Studio 2005부터 C ++에 유효합니다 .
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

pragma는 Visual Studio 2005에서 Visual Studio 2015까지의 C #에 유효하지 않습니다 .
오류 : "예상 비활성화 또는 복원".
(나는 그들이 구현하지 않은 것 같아요 suppress...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C #에는 다른 형식이 필요합니다. 다음과 같이 표시됩니다 (작동하지 않음).

#pragma warning suppress 0642  // (suppress one error in the next line)

대신 suppress, 당신은에있는 disableenable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

정말 못 생겼습니다. 스타일을 다시 지정하는 것이 더 현명하다고 생각합니다.

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

5

파일 (또는 헤더 파일) 위에 배치하는 대신 여기에 표시된대로 문제의 코드를 #pragma warning (push), #pragma warning (disable)및 일치하는으로 감싸 십시오 .#pragma warning (pop)

를 포함한 다른 옵션이 있지만 #pramga warning (once).


5

하나는 또한 사용할 수 있습니다 UNREFERENCED_PARAMETER에 정의 WinNT.H. 정의는 다음과 같습니다.

#define UNREFERENCED_PARAMETER(P)          (P)

그리고 다음과 같이 사용하십시오.

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

왜 그것을 사용합니까, 변수 이름 자체를 생략 할 수 있다고 주장 할 수 있습니다. 변수가 실제로 사용될 수있는 경우 (다른 프로젝트 구성, 디버그 / 릴리스 빌드)가 있습니다. 다른 구성에서는 변수가 사용되지 않은 상태 (따라서 경고)입니다.

일부 정적 코드 분석은이 말도 안되는 문장 ( wParam;)에 대해 여전히 경고를 제공 할 수 있습니다 . 이 경우 디버그 빌드 DBG_UNREFERENCED_PARAMETER와 동일하고 릴리스 빌드에서 사용할 수 있습니다.UNREFERENCED_PARAMETERP=P

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

1
참고 우리는이 11 C ++ 이후 [[maybe_unused]]속성
metablaster을

2

unreferenced local variable일부 헤더에 쓰기 를 비활성화하려면

template<class T>
void ignore (const T & ) {}

그리고 사용

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

2
경고를 억제하기위한 함수 호출? 대신 이것을하지 않는 이유 : (void)unusedVar;?
Nawaz

@Nawaz : (void)unusedVar;?C ++ 표준을 준수하지 않는 것 같습니다 .
Alexey Malistov 2011-08-23

2
값이 아무것도 아닌 표현입니다. C ++에서는 static_cast<void>(unusedVar).
Nawaz 2011 년


2
§5.2.9 / 4는 말한다 Any expression can be explicitly converted to type “cv void.” The expression value is discarded당신이 쓸 수있는에 따라 static_cast<void>(unusedVar)static_cast<const void>(unusedVar)static_cast<volatile void>(unusedVar). 모든 양식이 유효합니다. 나는 그것이 당신의 의심을 명확히하기를 바랍니다.
Nawaz

2

특정 상황에서는 명명 된 매개 변수가 있어야 하지만 직접 사용하지는 않습니다.
예를 들어 VS2010에서 'e'가 decltype문 내에서만 사용 되면 컴파일러가 불평하지만 varible이라는 이름이 있어야합니다 e.

위의 모든 비 #pragma제안은 모두 하나의 문장을 추가하는 것으로 요약됩니다.

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

1
이제 (MS VS2015 컴파일러에서) 이로 인해 C4702에 연결할 수없는 코드가 발생합니다.
Cee McSharpface

2

@rampion이 언급했듯이 clang gcc에있는 경우 경고는 번호가 아닌 이름으로 표시되며 다음을 수행해야합니다.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

이 정보는 여기 에서 온다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.