답변:
내가 본 해킹은 &&
연산자 를 사용하는 것 입니다. 널이 아닌 경우 포인터가 "참"이므로 조건을 변경하지 않고 다음을 수행 할 수 있습니다.
assert(a == b && "A is not equal to B");
이후 assert
쇼에 실패하는 조건, 너무 당신의 메시지를 표시합니다. 충분하지 않으면 myAssert
원하는 것을 표시하는 자체 함수 또는 매크로를 작성할 수 있습니다 .
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
는 아무것도 인쇄하지 않으면 0이 아닌 값을 반환하므로 assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, 당신은 아마도 자신의 assert wrapper를 작성해야합니다.
또 다른 옵션은 피연산자를 뒤집고 쉼표 연산자를 사용하는 것입니다. 추가 괄호가 필요하므로 쉼표가 인수 사이의 구분자로 취급되지 않습니다.
assert(("A must be equal to B", a == b));
(이것은 더 나은 가시성을 위해 위의 주석에서 복사되었습니다)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
다음은 메시지를 수락하고 모든 것을 명확한 방식으로 인쇄하는 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 행
친절하고 깨끗하며 코드에서 자유롭게 사용하십시오 =)
x == y
. 그러면 Expr이 확장되고 if( !(x == y))
여기에서 조건이 확인되고 #Expr이 string literal으로 확장 "x == y"
되어 오류 메시지가 표시됩니다.
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__
사용자 정의 메시지를 취 자신의 기능 등