<QtAssert>

개발 및 디버깅 중 조건 확인을 위한 매크로. 더 보기...

Header: #include <QtAssert>

함수

T *q_check_ptr(T *p)

매크로

void Q_ASSERT(bool test)
void Q_ASSERT_X(bool test, const char *where, const char *what)
void Q_CHECK_PTR(void *pointer)
(since 6.11) void Q_PRESUME(bool expr)
void Q_UNREACHABLE()
(since 6.5) void Q_UNREACHABLE_RETURN(...)

상세 설명

함수 문서

template <typename T> T *q_check_ptr(T *p)

p 에서 Q_CHECK_PTR 를 호출한 후, p 를 반환합니다.

이는 Q_CHECK_PTR 의 인라인 버전으로 사용할 수 있습니다.

매크로 설명서

void Q_ASSERT(bool test)

test 가 false 인 경우, 소스 코드 파일 이름과 줄 번호가 포함된 경고 메시지를 출력합니다.

Q_ASSERT()는 개발 과정에서 전제 조건 및 후제 조건을 테스트하는 데 유용합니다. 컴파일 시 ` QT_NO_DEBUG `가 정의된 경우에는 아무런 동작도 수행하지 않습니다.

예시:

// File: div.cpp

#include <QtGlobal>

int divide(int a, int b)
{
    Q_ASSERT(b != 0);
        return a / b;
}

b 가 0인 경우, Q_ASSERT 문은 qFatal() 함수를 사용하여 다음 메시지를 출력합니다:

ASSERT: "b != 0" in file div.cpp, line 7

Q_ASSERT_X(), qFatal() 및 디버깅 기법도 참조하십시오 .

void Q_ASSERT_X(bool test, const char *where, const char *what)

test 가 false 인 경우, “ what ”라는 메시지와 함께 위치 “ where ”, 소스 파일 이름 및 줄 번호를 출력합니다.

Q_ASSERT_X는 개발 과정에서 전제 조건 및 후제 조건을 테스트하는 데 유용합니다. 컴파일 시점에 ` QT_NO_DEBUG `가 정의된 경우에는 아무런 동작도 수행하지 않습니다.

예시:

// File: div.cpp

#include <QtGlobal>

int divide(int a, int b)
{
    Q_ASSERT_X(b != 0, "divide", "division by zero");
        return a / b;
}

b 가 0인 경우, Q_ASSERT_X 문은 qFatal() 함수를 사용하여 다음 메시지를 출력합니다:

ASSERT failure in divide: "division by zero", file div.cpp, line 7

Q_ASSERT(), qFatal(), 디버깅 기법항목도 참조하십시오 .

void Q_CHECK_PTR(void *pointer)

pointer 가 nullptr 인 경우, 소스 코드의 파일명과 줄 번호를 포함한 메시지를 출력하며, 프로그램의 메모리가 부족하여 실행이 중단되었음을 알립니다. 예외 처리가 활성화된 경우에는 대신 std::bad_alloc 예외를 발생시킵니다.

컴파일 시 QT_NO_DEBUG 와 QT_NO_EXCEPTIONS 가 정의된 경우, Q_CHECK_PTR은 아무런 동작도 하지 않습니다. 따라서 메모리 할당이 성공적으로 이루어졌는지 확인하기 위해 Q_CHECK_PTR을 사용해서는 안 됩니다. 일부 경우에서 해당 검사가 비활성화될 수 있기 때문입니다.

예시:

int *a;

Q_CHECK_PTR(a = new int[80]);   // WRONG!

a = new (std::nothrow) int[80];      // Right
Q_CHECK_PTR(a);

qWarning() 및 디버깅 기법도 참조하십시오 .

[since 6.11] void Q_PRESUME(bool expr)

컴파일러가 ` expr `을 ` true`으로 간주하도록 합니다.

이 매크로는 컴파일러가 지원하는 경우 Q_ASSERT()과 C++23 스타일의 [[assume]] 속성을 생성합니다. 그렇지 않은 경우 Q_ASSERT()으로 대체됩니다.

이 매크로는 Qt 6.11에서 도입되었습니다.

Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY(), Q_ASSUME()도 참조하십시오 .

void Q_UNREACHABLE()

컴파일러에게 현재 지점이 어떤 실행 경로를 통해서도 도달할 수 없음을 알려주므로, 컴파일러는 이곳으로 이어지는 모든 코드 경로와 이곳에서 이어지는 코드를 사멸 코드로 최적화할 수 있습니다.

이 매크로는 실현 불가능한 조건을 표시하는 데 유용합니다. 예를 들어, 다음과 같은 열거형이 주어졌을 때:

   enum Shapes {
       Rectangle,
       Triangle,
       Circle,
       NumShapes
   };

다음과 같이 switch 문 테이블을 작성할 수 있습니다:

    switch (shape) {
        case Rectangle:
            return rectangle();
        case Triangle:
            return triangle();
        case Circle:
            return circle();
        case NumShapes:
            Q_UNREACHABLE();
            break;
    }

해당 지점에 Q_UNREACHABLE()을 삽입하면, 컴파일러가 해당 값을 포함하는 shape 변수에 대한 코드를 생성하지 않도록 지시할 수 있다는 장점이 있습니다. 이 매크로가 누락된 경우, 컴파일러는 여전히 해당 값에 대한 필요한 비교 연산을 생성하게 됩니다. case 레이블이 제거된 경우, 일부 컴파일러는 특정 열거형 값이 검사되지 않았다는 경고를 출력할 수 있습니다.

불가능한 조건에서 이 매크로를 사용하면 사멸된 코드 경로가 제거되어 코드 커버리지가 향상될 수 있습니다.

디버그 빌드에서는 디버깅을 용이하게 하기 위해 어설트(assert)를 통해 해당 조건이 강제 적용됩니다.

참고: 매크로 Q_UNREACHABLE_RETURN()을사용하면 , 해당 매크로의 존재를 문제 삼는 컴파일러에서 경고를 유발하지 않으면서도, 리턴 문이 필요한 컴파일러를 위해 리턴 문을 삽입할 수 있습니다.

Q_ASSERT(), qFatal(), Q_UNREACHABLE_RETURN(), Q_PRESUME()도 참조하십시오 .

[since 6.5] void Q_UNREACHABLE_RETURN(...)

이는 다음과 동일합니다.

Q_UNREACHABLE();
return __VA_ARGS__;

와 동일하지만, 이에 대해 경고 메시지를 표시하는 컴파일러에서는 return 문을 생략한다는 점이 다릅니다.

이 매크로는 Qt 6.5에서 도입되었습니다.

Q_UNREACHABLE() 및 Q_PRESUME()도 참조하십시오 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.