Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
헤더 파일에 정의됨 <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(C23 이전)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#endif
(C23 이후)

매크로 assert 의 정의는 표준 라이브러리에서 정의하지 않는 또 다른 매크로, NDEBUG 에 따라 달라집니다.

만약 NDEBUG 가 소스 코드에서 <assert.h> 가 포함되는 지점에서 매크로 이름으로 정의되어 있다면, assert 는 아무 동작도 수행하지 않습니다.

만약 NDEBUG 가 정의되지 않았다면, assert 인자 (C23까지) __VA_ARGS__ 로부터 합성된 표현식 (C23부터) (스칼라 타입을 가져야 하며, 그렇지 않으면 동작이 정의되지 않음)이 0과 같은지 비교합니다. 만약 0과 같다면, assert 는 표준 오류 출력에 구현체 정의 진단 정보를 출력하고 abort ( ) 를 호출합니다. 진단 정보는 expression 의 텍스트와 미리 정의된 변수 __func__ (C99부터) 미리 정의된 매크로 __FILE__ __LINE__ 의 값을 포함해야 합니다.

목차

매개변수

조건 - 스칼라 타입의 표현식

반환값

(없음)

참고 사항

assert 오류에 추가 메시지를 포함하기 위한 표준화된 인터페이스는 존재하지 않습니다. 이식 가능한 방법으로는 콤마 연산자 를 사용하거나, 문자열 리터럴과 함께 && 를 사용하는 것이 있습니다:

assert(("빛이 다섯 개 있습니다", 2 + 2 == 5));
assert(2 + 2 == 5 && "빛이 다섯 개 있습니다");

Microsoft CRT assert 구현은 기본 함수( _wassert )가 __func__ 또는 이에 상응하는 대체자를 전혀 받지 않기 때문에 C99 및 이후 개정판을 준수하지 않습니다.

C23에서의 assert 변경 사항( N2829 )이 공식 결함 보고서는 아니지만, C 위원회는 구현체들이 이 변경 사항을 이전 모드로 백포트할 것을 권장합니다 .

예제

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
#define TEST(...) __VA_ARGS__
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
    assert(TEST(x >= 0.0));
    return 0;
}

가능한 출력:

--- Output with NDEBUG not defined: ---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.
--- Output with NDEBUG defined: ---
sqrt(x) = -nan

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.2.2.1 assert 매크로 (p: 196)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.2.1.1 assert 매크로 (p: 135)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.2.1.1 assert 매크로 (p: 186-187)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.2.1.1 assert 매크로 (p: 169)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.2.1.1 assert 매크로

참고 항목

비정상적인 프로그램 종료를 유발합니다 (정리 작업 없이)
(함수)