Nice programing

#pragma 경고 푸시 / 팝을 사용하여 일시적으로 경고 수준을 변경하는 것이 올바른 방법입니까?

nicepro 2020. 11. 4. 08:25
반응형

#pragma 경고 푸시 / 팝을 사용하여 일시적으로 경고 수준을 변경하는 것이 올바른 방법입니까?


가끔 경고를 전혀 발생시키지 않는 C ++ 코드를 작성하기가 어렵습니다. 그러나 경고를 활성화하는 것은 좋은 생각입니다. 따라서 특정 구성에 대한 경고를 비활성화하고 다른 모든 코드에서 활성화되도록해야하는 경우가 많습니다.

지금까지 두 가지 방법을 보았습니다.

첫 번째는 사용하는 것입니다 #pragma warning( push )#pragma warning( pop ):

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

두 번째는 다음을 사용하는 것입니다 #pragma warning( default ).

 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( default: ThatWarning )

두 번째 변형에서 볼 수있는 문제는 원래 경고 수준을 버린다는 것입니다. 경고가 그 전에 꺼 졌거나 경고 수준이 변경되었을 수 있습니다. 사용하면 default이러한 변경 사항이 삭제됩니다.

첫 번째 접근 방식은 깨끗해 보입니다. 그것에 문제가 있습니까? 더 나은 방법이 있습니까?


첫 번째 방법은이를 수행하는 가장 좋은 방법 인 IMO입니다. 나는 그것에 문제가 없다는 것을 알고 있습니다.

#pragma는 컴파일러에 따라 다르므로 모든 컴파일러에서 작동 할 것으로 기대하지 마십시오. :)


이것은 여러 컴파일러 (및 다른 버전의 컴파일러)에서 작동합니다.

헤더 "푸시"

#if defined(__clang__)
# pragma clang diagnostic push
#endif

#if defined(_MSC_VER)
# pragma warning(push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler push warning
#endif

헤더 "팝"

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

약간의 경고

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

용법

// This code reports warnings
// ...
#include <ignore_compiler_warning/push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

또한 경비원은 이중 푸시 / 팝 / 비활성화 경고 pragma가 없는지 확인할 수 있습니다.

최신 정보


sharptooth에는 너무 늦었지만 모든 Google 직원에게는 다음과 같습니다.

#pragma warning ( suppress: ThatWarning )
// one single line with ThatWarning

의 약자입니다 (일반적으로 VS 2008 이후 이지만 VS 2005 에서는 코드 분석기 경고에만 해당) :

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )

올바른 접근 방식 (조금 못 생겼지 만)

#ifdef _MSC_VER
 #pragma warning( push )
 #pragma warning( once: ThatWarning )
#endif
 //code with ThatWarning here
#ifdef _MSC_VER
 #pragma warning( pop )
#endif

You can disable specific warnings in the project or file options and this setting applies as the 'default' per those #pragmas at the relevant scope. Some of the warnings in VS2005 are so useless/annoying that this cleans up the output quite a bit, if using /W4.

This is in Properties under Configuration Properties -> C/C++ -> Advanced.


I have no problems with the first variant. May be the better way is to use the following:

 #pragma warning( push )
 #pragma warning( once: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

This will let you know that there're still warnings in the code, but the warning messages will not be so annoying. But that is the matter of taste.

참고URL : https://stackoverflow.com/questions/4193476/is-using-pragma-warning-push-pop-the-right-way-to-temporarily-alter-warning-lev

반응형