programing

assert(0)의 의미는 무엇입니까?

lastcode 2023. 8. 10. 18:49
반응형

assert(0)의 의미는 무엇입니까?

시험 중에 이런 문제가 있었는데 어떻게 대답해야 할지 아직도 잘 모르겠어요.주장이 프로그램을 테스트하는 방법이라는 것은 이해하지만, 무엇을 확인하는지는 잘 모르겠습니다.이건 속임수 질문입니까?그것은 항상 실패할 것이지만, 나는 왜 그런지 이해할 수 없습니다.무엇을 확인하고 있습니까?

어떤 설명이든 좋습니다, 감사합니다.

은 C++의 합니다.assert표준에 .C 으로준기

C99 §7.2/2:

assert매크로는 프로그램에 진단 테스트를 삽입합니다. 표현식을 피하기 위해 확장됩니다.실행될 때 식(스칼라 유형을 가져야 함)이 거짓인 경우(즉, 0과 동일한 비교), 아사트 매크로는 실패한 특정 호출에 대한 정보를 씁니다(인수 텍스트, 소스 파일 이름, 소스 라인 번호,및 엔클로저 함수의 이름 - 후자는 각각 전처리 매크로의 값입니다.__FILE__그리고.__LINE__ 그고식의자별리▁the의.__func__를) 구현 형식의 에 표시합니다는 표준 오류 파일에 구현 정의 형식으로 표시됩니다.그런 다음 다음 다음을 호출합니다.abort기능.


assert(0)그자리의 0는 로해됩니다로 됩니다.false따라서 어설션 검사가 켜져 있을 때 이 어설션은 항상 실패하거나 실행됩니다.

그러므로 그것은 주장합니다.

"처형은 결코 이 지경에 이르지 못할 것입니다."

실제로 컴파일러가 특정 지점에 도달하거나 도달하지 않는 실행에 대해 종료하도록 만드는 것은 어려울 수 있습니다.종종 컴파일러는 먼저 값을 반환하지 않고 함수의 끝에 도달하는 실행에 대해 불평합니다. 추가assert(0)이상적으로 그 문제를 해결해야 하지만, 컴파일러는 그것에 대해 불평할 수 있습니다.assert또는 경고하려는 내용을 이미 잘 알고 있다는 것을 인식하지 못합니다.

이 경우 가능한 한 가지 방법은 해당 지점에 예외를 두는 것입니다.

auto foo( int x )
    -> int
{
    if( x == 1 ) { return 42; }
    assert( 0 ); throw 0;       // Should never get here!
}

물론 그 이중고는 더 높은 수준의 매크로로 정의될 수 있습니다.는 "예외 유형"이 아닌 "예외 유형"으로하는 것이 .std::exception왜냐하면 이것은 보통 사람들에 의해 잡히려고 의도된 예외가 아니기 때문입니다.catch아무 곳이나.또는 표준 예외 계층을 신뢰하는 경우(나에게는 말이 안 되지만) 다음을 사용할 수 있습니다.std::logic_error.


assert단언 검사 기호를 정의할 수 있습니다.NDEBUG포함하기 전에<assert.h>.

이 헤더는 특별한 지원을 제공하므로 포함 여부와 상관없이 여러 번 포함할 수 있습니다.NDEBUG확정된

C++11 §17.6.2.2/2:

번역 유닛은 임의의 순서로 라이브러리 헤더를 포함할 수 있습니다(2항).각각은 두 번 이상 포함될 수 있으며, 다음 중 하나를 포함하는 효과를 제외하고 정확히 한 번 포함되는 것과 다른 효과는 없습니다.<cassert>또는<assert.h>의 어휘적으로 현재 정의에 따라 매번 달라집니다.NDEBUG.

위에서 논의한 이중고에 대한 합리적인 정의는 마찬가지로 다음에 의존할 수 있습니다.NDEBUG예를 들어, 인크루드 가드 없이.

File assert_should_never_get_here.hpp
#include <stdexcept>        // std::logic_error
#include <assert.h>

#undef ASSERT_SHOULD_NEVER_GET_HERE
#ifdef NDEBUG
#   define ASSERT_SHOULD_NEVER_GET_HERE() \
        throw std::logic_error( "Reached a supposed unreachable point" )
#else
#   define ASSERT_SHOULD_NEVER_GET_HERE() \
        do{ \
            assert( "Reached a supposed unreachable point" && 0 ); \
            throw 0; \
        } while( 0 )
#endif

고지 사항:제가 2000년대 초반에 코드를 여러 번 작성하면서 이 답을 위해 위의 코드를 조작했고, g++로 테스트를 했지만 반드시 완벽한 것은 아닐 수도 있습니다.


(1) 또 다른 가능성인 g++ 고유의 본질에 대한 논의는 바실 스타린케비치의 대답을 참조하십시오.__builtin_unreachable.

그것은 항상 실패할 것입니다.거의 다 됐어요.x = 5일 때마다 "sys(x == 5)"가 성공하는 것과 동일한 이유로 항상 실패합니다.

만약 당신이 애플리케이션을 요청한다면, 당신은 그것을 코드 블록에 넣을 것이고, 그것은 실제로 일어나서는 안 됩니다.

switch(suit) {
  case CLUB:
  case DIAMOND:
  case HEART:
  case SPADE:
  // ...
  default:
    assert(0);
 }

네, 항상 실패합니다.

assert(0)또는assert(false)일반적으로 도달할 수 없는 코드를 표시하는 데 사용되므로 디버그 모드에서 도달할 수 없는 것으로 추정되는 도달에 도달할 때 진단 메시지가 나오고 프로그램이 중단됩니다. 이는 프로그램이 우리가 생각하는 것처럼 작동하지 않는다는 명확한 신호입니다.

다른 답변(특히 이 답변) 에도, 최근 GCC(또는 Clang)를 사용하는 경우, 특히 내장된 GCC를 사용하는 것을 고려할 수 있습니다.__builtin_unreachable()assert(0).

가지 차이점이 : 몇가지차이있다: 첫째이,assert으로 비활성화할 수 있습니다.-DNDEBUG.그리고.__builtin_unreachable컴파일러가 코드를 최적화하는 방식을 변경합니다.

일부 론물일컴는이에대못알다합니에 대해 알지 .__builtin_unreachable.

그리고 당신은 또한 몇몇 사람들에게 전화하는 것을 고려할 수 있습니다.[[noreturn]]C++ 함수(C++11 이상) - 또는 다음과 같은 GCC용abort()

그건 그렇고.assert(0) 수 때문에) 어떤 를 던지는 것과 같은 .

언급URL : https://stackoverflow.com/questions/34236653/what-does-assert0-mean

반응형