답변:
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
clang
이 pragma를 지원하지 않는 것,하지만 당신과 같은 효과를 얻을 수 있습니다 #pragma clang diagnostic push
, #pragma clang diagnostic ignored "-Wunused-variable"
하고 #pragma clang diagnostic pop
. 참조 연타 사용자 설명서의 "제어 Diagnositics 통해하는 pragma를"
/wd4101
. :
플래그와 숫자 사이 에는 정상이 없으며 쉼표로 구분 된 숫자 목록을 수행 할 수 없습니다. 다른 컴파일러의 경우 대신 그럴 수 있습니다 /nowarn:4101
.
한 줄의 코드에서만 경고를 표시하지 않으려면 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)
suppress
지정 자는 사전 처리 된 단일 코드 줄에서 작동합니다. 다음 행 #pragma warning(suppress: ...)
이 #include
지시문 (매개 변수가 참조하는 파일을 현재 컴파일 단위로 확장) 인 경우 효과는 해당 파일의 첫 번째 행에만 적용됩니다. 경고는 컴파일러에 의해 생성되기 때문에 이것은 분명해야합니다. 컴파일러는 사전 처리 된 코드에서 작동합니다.
#pragma
푸시 / 팝은 종종 이러한 종류의 문제에 대한 해결책이지만이 경우 참조되지 않은 변수를 제거하지 않는 이유는 무엇입니까?
try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}
:P
).
예:
#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
, 당신은에있는 disable
및 enable
:
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
하나는 또한 사용할 수 있습니다 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_PARAMETER
P=P
#define DBG_UNREFERENCED_PARAMETER(P) (P) = (P)
[[maybe_unused]]
속성
unreferenced local variable
일부 헤더에 쓰기 를 비활성화하려면
template<class T>
void ignore (const T & ) {}
그리고 사용
catch(const Except & excpt) {
ignore(excpt); // No warning
// ...
}
(void)unusedVar;
?
(void)unusedVar;?
C ++ 표준을 준수하지 않는 것 같습니다 .
static_cast<void>(unusedVar)
.
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)
. 모든 양식이 유효합니다. 나는 그것이 당신의 의심을 명확히하기를 바랍니다.
특정 상황에서는 명명 된 매개 변수가 있어야 하지만 직접 사용하지는 않습니다.
예를 들어 VS2010에서 'e'가 decltype
문 내에서만 사용 되면 컴파일러가 불평하지만 varible이라는 이름이 있어야합니다 e
.
위의 모든 비 #pragma
제안은 모두 하나의 문장을 추가하는 것으로 요약됩니다.
bool f(int e)
{
// code not using e
return true;
e; // use without doing anything
}
catch (const std::exception& /* unnamed */) {.... }
. 질문에 대한 답변은 아니지만 문제를 해결할 수 있습니다.