다음을 통해 공유


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를 정의하여 어설션 검사를 끌 수 있습니다. 명령줄 옵션을 사용하여 소스 파일을 수정하지 않고 매크로를 /DNDEBUGassert 수 있습니다. 포함되기 assert 전에 <assert.h> 지시문을 사용하여 소스 코드에서 매크로를 #define NDEBUG 끌 수 있습니다.

매크로는 assert (0)로 계산되고 프로그램 실행을 중지하기 false 위해 호출 abort 할 때 expression 진단 메시지를 출력합니다. expressiontrue (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