assert
| 헤더 <cassert>
|
||
| 에 정의됨 |
||
#define assert(condition) ((void)0)
|
비활성화된 어서션 | (C++26까지) |
#define assert(...) ((void)0)
|
(C++26부터) | |
| 활성화된 어서션 |
||
#define assert(condition) /* unspecified */
|
(C++26까지) | (C++26부터) |
#define assert(...) /* unspecified */
|
매크로 | |
의 정의는 표준 라이브러리에서 정의되지 않은 다른 매크로 assert에 따라 달라집니다.
NDEBUG1)
NDEBUG 또는 <assert.h>가 포함된 소스 코드 지점에서 <이 매크로 이름으로 정의된 경우 어서션이 비활성화됩니다: >는 아무것도 하지 않습니다.assert2)|
|
(C++26까지) |
|
|
(C++26부터) |
진단 정보는 구현 정의 형식이지만 항상 다음 정보를 포함합니다:
|
의 텍스트 (C++26까지) |
|
(C++26부터) |
|
다음 중 하나의 경우 표현식
|
(C++11부터) |
매개변수
| 조건 | - | 스칼라 타입의 표현식 |
참고 사항
|
assert(std::is_same_v<int, int>); // error: assert does not take two arguments assert((std::is_same_v<int, int>)); // OK: one argument static_assert(std::is_same_v<int, int>); // OK: not a macro std::complex<double> c; assert(c == std::complex<double>{0, 0}); // error assert((c == std::complex<double>{0, 0})); // OK |
(C++26 이전) |
assert
오류에 추가 메시지를 넣는 표준화된 인터페이스는 존재하지 않습니다. 이식 가능한 방법으로는
콤마 연산자
가
오버로드
되지 않은 경우 이를 사용하거나, 문자열 리터럴과 함께
&&
를 사용하는 방법이 있습니다:
assert(("빛은 다섯 개 있습니다", 2 + 2 == 5)); assert(2 + 2 == 5 && "빛은 다섯 개 있습니다");
assert
의
Microsoft CRT
구현은 C++11 및 이후 개정판을 준수하지 않습니다. 왜냐하면 해당 기본 함수(
_wassert
)가
__func__
또는 이에 상응하는 대체자를 전혀 받지 않기 때문입니다.
C++20부터, 진단 메시지에 필요한 값들은 std::source_location::current() 에서도 얻을 수 있습니다.
C23/C++26에서
assert
의 변경이 공식적으로 결함 보고서는 아니지만, C 위원회는
구현체들이
이 변경 사항을 이전 모드로 백포트할 것을 권장합니다.
예제
#include <iostream> // uncomment to disable assert() // #define NDEBUG #include <cassert> // Use (void) to silence unused warnings. #define assertm(exp, msg) assert((void(msg), exp)) int main() { assert(2 + 2 == 4); std::cout << "Checkpoint #1\n"; assert((void("void helps to avoid 'unused value' warning"), 2 * 2 == 4)); std::cout << "Checkpoint #2\n"; assert((010 + 010 == 16) && "Yet another way to add an assert message"); std::cout << "Checkpoint #3\n"; assertm((2 + 2) % 3 == 1, "Success"); std::cout << "Checkpoint #4\n"; assertm(2 + 2 == 5, "Failed"); // assertion fails std::cout << "Execution continues past the last assert\n"; // No output }
가능한 출력:
Checkpoint #1 Checkpoint #2 Checkpoint #3 Checkpoint #4 main.cpp:23: int main(): Assertion `((void)"Failed", 2 + 2 == 5)' failed. Aborted
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2234 | C++11 |
assert
상수 표현식에서 사용할 수 없었음
|
사용 가능 |
참고 항목
contract_assert
statement
(C++26)
|
실행 중 내부 조건을 검증합니다 |
static_assert
declaration
(C++11)
|
컴파일 타임 어서션 검사를 수행합니다 |
|
비정상적인 프로그램 종료를 유발합니다 (정리 작업 없이)
(함수) |
|
|
C documentation
for
assert
|
|