Programming

assert에 맞춤 메시지를 추가 하시겠습니까?

procodes 2020. 7. 26. 13:20
반응형

assert에 맞춤 메시지를 추가 하시겠습니까?


assert가 던진 메시지를 추가하거나 편집하는 방법이 있습니까? 나는 같은 것을 사용하고 싶습니다

assert(a == b, "A must be equal to B");

그런 다음 컴파일러는 line , time 등을 추가합니다 ...

가능합니까?


내가 본 해킹은 &&연산자 를 사용하는 것 입니다. 널이 아닌 경우 포인터가 "참"이므로 조건을 변경하지 않고 다음을 수행 할 수 있습니다.

assert(a == b && "A is not equal to B");

이후 assert쇼에 실패하는 조건, 너무 당신의 메시지를 표시합니다. 충분하지 않으면 myAssert원하는 것을 표시하는 자체 함수 또는 매크로를 작성할 수 있습니다 .


또 다른 옵션은 피연산자를 뒤집고 쉼표 연산자를 사용하는 것입니다. 추가 괄호가 필요하므로 쉼표가 인수 사이의 구분자로 처리되지 않습니다.

assert(("A must be equal to B", a == b));

(이것은 더 나은 가시성을 위해 위의 주석에서 복사되었습니다)


다음은 메시지를 허용하고 모든 것을 명확한 방식으로 인쇄하는 assert 매크로의 내 버전입니다.

#include <iostream>

#ifndef NDEBUG
#   define M_Assert(Expr, Msg) \
    __M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
#   define M_Assert(Expr, Msg) ;
#endif

void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
    if (!expr)
    {
        std::cerr << "Assert failed:\t" << msg << "\n"
            << "Expected:\t" << expr_str << "\n"
            << "Source:\t\t" << file << ", line " << line << "\n";
        abort();
    }
}

이제 이것을 사용할 수 있습니다

M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");

그리고 실패하는 경우 다음과 같은 메시지가 나타납니다.

어설 션 실패 : MyFunction : 널이 아닌 인수 필요

예상 : ptr! = nullptr

출처 : C : \ MyProject \ src.cpp, 22 행

친절하고 깨끗하며 코드에서 자유롭게 사용하십시오 =)


BOOST_ASSERT_MSG(expre, msg)

http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

직접 사용하거나 Boost의 코드를 복사 할 수 있습니다. 또한 Boost assert는 헤더 전용이므로 모든 Boost를 설치하지 않으려는 경우 해당 단일 파일을 가져올 수 있습니다.


zneak의 답변이 코드를 다소 복잡하게 만들므로 더 나은 접근 방식은 단순히 말하는 텍스트를 주석 처리하는 것입니다. 즉 :

assert(a == b); // A must be equal to B

assert 오류의 독자는 오류 메시지에서 파일과 행을 조회하므로 여기에서 전체 설명을 볼 수 있습니다.

하루가 끝날 때 이렇게 :

assert(number_of_frames != 0); // Has frames to update

이것보다 더 잘 읽습니다.

assert(number_of_frames != 0 && "Has frames to update");

코드의 인간 파싱 측면에서 가독성. 언어 해킹도 아닙니다.


assert는 매크로 / 함수 조합입니다. 당신은 사용하여 자신 만의 매크로 / 함수를 정의 할 수 있습니다 __FILE__, __BASE_FILE__, __LINE__사용자 정의 메시지를 취 자신의 기능 등


왜 가장 깨끗한 해결책을 언급하지 않았습니까?

bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);

vc의 경우 assert.h에 다음 코드를 추가하십시오.

#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )

참고 URL : https://stackoverflow.com/questions/3692954/add-custom-messages-in-assert

반응형