assert
macro, _assert
, _wassert
식을 계산하고 결과가 false
이면 진단 메시지를 출력하고 프로그램을 중단합니다.
구문
assert(
expression
);
void _assert(
char const* message,
char const* filename,
unsigned line
);
void _wassert(
wchar_t const* message,
wchar_t const* filename,
unsigned line
);
매개 변수
expression
0이 아닌 값(true
) 또는 0(false
)으로 계산되는 스칼라 식(포인터 식 포함)입니다.
message
표시할 메시지입니다.
filename
어설션이 실패한 소스 파일의 이름입니다.
line
실패한 어설션의 소스 파일에 있는 줄 번호입니다.
설명
일반적으로 assert
매크로는 프로그램을 개발하는 동안 논리 오류를 식별하는 데 사용됩니다. 이 매크로를 사용하여 프로그램이 잘못 작동할 때만 expression
로 계산되도록 false
인수를 구현하는 방식으로 예기치 않은 조건이 발생할 때 프로그램 실행을 중지합니다. 컴파일 시간에 매크로 NDEBUG
를 정의하여 어설션 검사를 끌 수 있습니다. 명령줄 옵션을 사용하여 소스 파일을 수정하지 않고 매크로를 /DNDEBUG
끌 assert
수 있습니다. 포함되기 assert
전에 <assert.h>
지시문을 사용하여 소스 코드에서 매크로를 #define NDEBUG
끌 수 있습니다.
매크로는 assert
(0)로 계산되고 프로그램 실행을 중지하기 false
위해 호출 abort
할 때 expression
진단 메시지를 출력합니다. expression
이 true
(0이 아닌 값)이면 아무 작업도 수행되지 않습니다. 진단 메시지에는 실패한 식, 소스 파일의 이름 및 어설션이 실패한 줄의 번호가 포함됩니다.
진단 메시지는 와이드(wchar_t
) 문자로 인쇄됩니다. 따라서 식에 유니코드 문자가 있더라도 예상대로 작동합니다.
진단 메시지의 대상은 루틴을 호출한 애플리케이션의 형식에 따라 달라집니다. 콘솔 애플리케이션은 .를 통해 메시지를 받습니다 stderr
. Windows 기반 애플리케이션에서 Windows MessageBox
함수를 호출하여 메시지 상자를 만들어 중단, 다시 시도 및 무시의 세 가지 단추가 있는 메시지를 표시합니다. assert
사용자가 중단을 선택하면 프로그램이 즉시 중단됩니다. 사용자가 다시 시도를 선택하면 디버거가 호출되고 JIT(Just-In-Time) 디버깅이 사용하도록 설정된 경우 사용자가 프로그램을 디버그할 수 있습니다. 사용자가 무시를 선택하면 프로그램이 정상적인 실행을 계속합니다. 오류 조건이 있는 경우 무시를 클릭하면 호출 코드의 사전 조건이 충족되지 않았기 때문에 정의되지 않은 동작이 발생할 수 있습니다.
앱 유형에 관계없이 기본 출력 동작을 재정의하려면 출력-stderr 및 표시 대화 상자 동작 중에서 선택하도록 호출 _set_error_mode
합니다.
메시지를 표시한 후 assert
호출됩니다. 이 호출abort
은 중단, 다시 시도 및 무시 단추가 있는 대화 상자를 표시합니다. abort
는 프로그램을 종료하므로 다시 시도 및 무시 단추는 호출 후 assert
프로그램 실행을 다시 시작하지 않습니다. 대화 상자 abort
가 표시되면 assert
대화 상자가 표시되지 않습니다. 대화 상자가 abort
표시되는 유일한 경우는 출력을 stderr로 보내는 경우 assert
입니다.
위의 동작의 결과로 디버그 모드에서 호출된 후 대화 상자가 assert
항상 표시됩니다. 각 단추의 동작은 아래 표에서 캡처됩니다.
오류 모드 | 출력: stderr (콘솔/_OUT_TO_STDERR ) |
표시 대화 상자(Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
종료 코드 3을 사용하여 즉시 종료 | 종료 코드 3을 사용하여 즉시 종료 |
Retry |
동안 디버거에 침입 abort |
동안 디버거에 침입 assert |
Ignore |
종료 완료 abort |
실행되지 않은 것처럼 assert 프로그램을 계속합니다(호출 코드의 사전 조건이 충족되지 않았기 때문에 정의되지 않은 동작이 발생할 수 있음) |
CRT 디버깅에 대한 자세한 내용은 CRT 디버깅 기술을 참조 하세요.
_assert
및 _wassert
함수는 내부 CRT 함수입니다. 이를 통해 어설션을 지원하기 위해 개체 파일에 필요한 코드를 최소화할 수 있습니다. 이러한 함수를 직접 호출하지 않는 것이 좋습니다.
assert
매크로는 정의되지 않은 경우 NDEBUG
C 런타임 라이브러리의 릴리스 및 디버그 버전 모두에서 사용하도록 설정됩니다. NDEBUG
정의되면 매크로를 사용할 수 있지만 인수를 평가하지 않으며 아무런 영향도 주지 않습니다. 매크로를 사용하도록 설정하면 매크로가 assert
구현을 호출 _wassert
합니다. 다른 어설션 매크로 및 _ASSERT_EXPR
다른 어설션 매크로 _ASSERT
_ASSERTE
도 사용할 수 있지만 매크로가 정의되었을 때 _DEBUG
와 C 런타임 라이브러리의 디버그 버전과 연결된 코드에 있을 때만 전달된 식을 평가합니다.
요구 사항
루틴에서 반환된 값 | 필수 헤더 |
---|---|
assert , _wassert |
<assert.h> |
함수의 _assert
서명은 헤더 파일에서 사용할 수 없습니다. 함수의 _wassert
서명은 매크로가 정의되지 않은 경우에만 사용할 수 있습니다 NDEBUG
.
예시
이 프로그램에서 analyze_string
함수는 assert
매크로를 사용하여 문자열 및 길이와 관련된 여러 조건을 테스트합니다. 조건 중 하나라도 실패하면 프로그램이 실패의 원인을 나타내는 메시지를 출력합니다.
// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
프로그램에서 다음 출력이 생성됩니다.
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25
어설션 실패 후 운영 체제 및 런타임 라이브러리의 버전에 따라 다음과 유사한 내용이 포함된 메시지 상자가 표시 될 수 있습니다.
A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.
디버거가 설치되어 있으면 디버그 단추를 선택하여 디버거를 시작하거나, 프로그램을 닫아 종료합니다.
참고 항목
오류 처리
프로세스 및 환경 제어
abort
raise
signal
_ASSERT
, _ASSERTE
매크로 _ASSERT_EXPR
_DEBUG