컴파일러 경고(수준 1) C4834
'nodiscard' 특성이 포함된 함수의 반환 값을 버립니다.
설명
C++17 Standard [[nodiscard]]
부터 특성은 함수의 반환 값이 삭제되지 않도록 지정합니다. 호출자가 반환 값을 삭제하면 컴파일러는 경고 C4834를 생성합니다. 이 특성은 C++17에서 도입되었지만 컴파일러는 이 특성을 준수하고 사용 /std:c++14
중 이상일 때 이와 관련된 경고를 생성합니다.
이 경고를 해결하려면 코드에서 반환 값을 사용하지 않는 이유를 고려합니다. 함수 사용이 의도와 일치하지 않을 수 있습니다. 값을 할당하거나 값을 std::ignore
삭제하는 것이 의도적인 경우 캐스팅하여 경고를 우회할 void
수 있습니다.
std::ignore
C++11 이상으로 캐스팅하는 void
대신 할당을 사용하는 것이 좋습니다. 의도를 명확히 하고 코드 분석 설정에서 사용하도록 설정된 경우 경고 C26457을 트리거하지 않으므로 권장됩니다.
이 경고는 Visual Studio 2017 버전 15.3에서 수준 3 경고로 도입되었습니다. Visual Studio 2017 버전 15.7에서 수준 1 경고로 변경되었습니다. Visual Studio 2017 버전 15.3 이전 버전의 컴파일러에서 경고 없이 컴파일된 코드는 이제 C4834를 생성할 수 있습니다. 특정 컴파일러 버전 이상에서 도입된 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.
코드를 변경하지 않고 경고를 끄려면
pragma#pragma warning(suppress : 4834)
를 사용하여 warning
특정 코드 줄에 대한 경고를 끌 수 있습니다. 경고 pragma #pragma warning(disable : 4834)
를 사용하여 파일 내에서 경고를 끌 수도 있습니다. 명령줄 옵션을 사용하여 /wd4834
명령줄 빌드에서 전역적으로 경고를 끌 수 있습니다.
Visual Studio IDE에서 전체 프로젝트에 대한 경고를 해제하려면 다음을 수행합니다.
- 프로젝트에 대한 속성 페이지 대화를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조하세요.
- 구성 속성>C/C++>고급 페이지를 선택합니다.
- 특정 경고 사용 안 함 속성을 편집하여
4834
을(를) 추가합니다. 확인을 선택하여 변경 내용을 적용합니다.
예시
이 샘플에서는 C4834를 생성하고 이를 해결하는 네 가지 방법을 보여 줍니다.
// C4834.cpp
// compile using: cl /EHsc /std:c++17
#include <iostream>
[[nodiscard]]
int square_of(int i) { return i * i; }
int main()
{
square_of(42); // warning C4834: discarding return value of function with 'nodiscard' attribute
// If ignoring the [[nodiscard] attribute is unintentional, make use of the return value as intended:
// For example:
std::cout << "square_of(42) = " << square_of(42) << "\n"; // Ok
// Or:
int result = square_of(43); // Ok
std::cout << "square_of(43) = " << result << "\n";
// If ignoring the [[nodiscard]] attribute value is intentional, you have two options:
// Preferrably, assign the return value to std::ignore:
std::ignore = square_of(42); // Ok, C++11 and higher
// Alternatively, you can cast the return value to void.
// The intent may be less clear to other developers.
(void) square_of(42); // May produce warning C26457
return 0;
}