_ASSERT, _ASSERTE, _ASSERT_EXPR 매크로_ASSERT, _ASSERTE, _ASSERT_EXPR Macros

식을 계산 하 고 결과가 False 인 경우 디버그 보고서를 생성 합니다 (디버그 버전에만 해당).Evaluate an expression and generate a debug report when the result is False (debug version only).

구문Syntax

// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );

매개 변수Parameters

booleanExpressionbooleanExpression
0이 아닌 값(true) 또는 0(false)으로 계산되는 스칼라 식(포인터 식 포함)입니다.A scalar expression (including pointer expressions) that evaluates to nonzero (true) or 0 (false).

messagemessage
보고서 일부로 표시할 전각 문자열입니다.A wide string to display as part of the report.

설명Remarks

_ASSERT_EXPR, _ASSERT_ASSERTE 매크로를 사용 하 여 디버깅 프로세스 중 가정을 확인 하는 명확 하 고 간단한 메커니즘이 응용 프로그램에 제공 됩니다.The _ASSERT_EXPR, _ASSERT and _ASSERTE macros provide an application with a clean and simple mechanism for checking assumptions during the debugging process. 이들 매크로는 애플리케이션의 정품 빌드 시 호출되지 않도록 #ifdef 문에 포함할 필요가 없으므로 매우 유연합니다.They are very flexible because they do not need to be enclosed in #ifdef statements to prevent them from being called in a retail build of an application. 이 유연성을 얻으려면 _DEBUG 매크로를 사용합니다.This flexibility is achieved by using the _DEBUG macro. _ASSERT_EXPR, _ASSERT_ASSERTE 는 컴파일 시간에 _debug 가 정의 된 경우에만 사용할 수 있습니다._ASSERT_EXPR, _ASSERT and _ASSERTE are only available when _DEBUG is defined at compile time. _Debug 가 정의 되지 않은 경우 전처리 중에 이러한 매크로에 대 한 호출이 제거 됩니다.When _DEBUG is not defined, calls to these macros are removed during preprocessing.

_ASSERT_EXPR, _ASSERT_ASSERTEbooleanExpression 인수를 평가 하 고 결과가 false (0) 이면 진단 메시지를 인쇄 하 고 _CrtDbgReportW 를 호출 하 여 디버그 보고서를 생성 합니다._ASSERT_EXPR, _ASSERT and _ASSERTE evaluate their booleanExpression argument and when the result is false (0), they print a diagnostic message and call _CrtDbgReportW to generate a debug report. _ASSERT 매크로는 간단한 진단 메시지를 출력 하 고, _ASSERTE 는 메시지에 실패 한 식의 문자열 표현을 포함 하 고, _ASSERT_EXPR 에는 진단 메시지의 메시지 문자열이 포함 됩니다.The _ASSERT macro prints a simple diagnostic message, _ASSERTE includes a string representation of the failed expression in the message, and _ASSERT_EXPR includes the message string in the diagnostic message. BooleanExpression 가 0이 아닌 값으로 계산 되 면 이러한 매크로는 아무 작업도 수행 하지 않습니다.These macros do nothing when booleanExpression evaluates to nonzero.

_ASSERT_EXPR, _ASSERT_ASSERTE_CrtDbgReportW를 호출 하 여 모든 출력을 와이드 문자로 설정 합니다._ASSERT_EXPR, _ASSERT and _ASSERTE invoke _CrtDbgReportW, which causes all output to be in wide characters. _ASSERTEbooleanExpression 에서 유니코드 문자를 올바르게 인쇄 하 고 _ASSERT_EXPR 는 유니코드 문자를 메시지에 인쇄 합니다._ASSERTE properly prints Unicode characters in booleanExpression and _ASSERT_EXPR prints Unicode characters in message.

_ASSERTE 매크로는 실패 한 식을 지정 하 고 _ASSERT_EXPR 를 사용 하 여 생성 된 보고서에 메시지를 지정할 수 있으므로 사용자는 응용 프로그램 소스 코드를 참조 하지 않고 문제를 식별할 수 있습니다.Because the _ASSERTE macro specifies the failed expression, and _ASSERT_EXPR lets you specify a message in the generated report, they enable users to identify the problem without referring to the application source code. 그러나 _ASSERT_EXPR 에서 인쇄 되는 모든 메시지_ASSERTE 에 의해 평가 되는 모든 식은 응용 프로그램의 출력 (디버그 버전) 파일에 문자열 상수로 포함 된다는 단점이 있습니다.However, a disadvantage exists in that every message printed by _ASSERT_EXPR and every expression evaluated by _ASSERTE is included in the output (debug version) file of your application as a string constant. 따라서 _ASSERT_EXPR 또는 _ASSERTE에 대해 많은 수의 호출이 수행 되는 경우 이러한 식은 출력 파일의 크기를 크게 늘릴 수 있습니다.Therefore, if a large number of calls are made to _ASSERT_EXPR or _ASSERTE, these expressions can greatly increase the size of your output file.

_CrtSetReportMode_CrtSetReportFile 함수를 사용해서 지정하지 않으면 메시지가 설정에 해당하는 팝업 대화 상자에 표시됩니다.Unless you specify otherwise with the _CrtSetReportMode and _CrtSetReportFile functions, messages appear in a pop-up dialog box equivalent to setting:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReportW 는 디버그 보고서를 생성 하 고 현재 보고서 모드나 _CRT_ASSERT 보고서 형식에 대해 정의 된 모드 및 파일을 기반으로 대상을 결정 합니다._CrtDbgReportW generates the debug report and determines its destination or destinations, based on the current report mode or modes and file defined for the _CRT_ASSERT report type. 기본적으로 어설션 실패 및 오류는 디버그 메시지 창에 전달됩니다.By default, assertion failures and errors are directed to a debug message window. _CrtSetReportMode_CrtSetReportFile 함수는 각 보고서 종류의 대상을 정의하는 데 사용됩니다.The _CrtSetReportMode and _CrtSetReportFile functions are used to define the destinations for each report type.

대상이 디버그 메시지 창이 고 사용자가 다시 시도 단추를 클릭 하면 _CrtDbgReportW 가 1을 반환 하 여 _ASSERT_EXPR, _ASSERT_ASSERTE 매크로에서 디버거를 시작 합니다. JIT (just-in-time) 디버깅을 사용 하도록 설정 합니다.When the destination is a debug message window and the user clicks the Retry button, _CrtDbgReportW returns 1, causing the _ASSERT_EXPR, _ASSERT and _ASSERTE macros to start the debugger provided that just-in-time (JIT) debugging is enabled.

보고 프로세스에 대한 자세한 내용은 _CrtDbgReport, _CrtDbgReportW 함수를 참조하세요.For more information about the reporting process, see the _CrtDbgReport, _CrtDbgReportW function. 어설션 실패를 해결하고 이들 매크로를 디버깅 오류 처리 메커니즘으로 사용하는 방법에 대한 자세한 내용은 확인 및 보고에 매크로 사용을 참조하세요.For more information about resolving assertion failures and using these macros as a debugging error handling mechanism, see Using Macros for Verification and Reporting.

_ASSERT 매크로 외에도 ASSERT 매크로를 사용 하 여 프로그램 논리를 확인할 수 있습니다.In addition to the _ASSERT macros, the assert macro can be used to verify program logic. 이 매크로는 라이브러리의 디버그 및 릴리스 버전에서 둘 다 사용할 수 있습니다.This macro is available in both the debug and release versions of the libraries. _RPT, _RPTF 디버그 매크로는 디버그 보고서 생성에도 사용할 수 있지만 식을 계산하지 않습니다.The _RPT, _RPTF debug macros are also available for generating a debug report, but they do not evaluate an expression. _Rpt 매크로는 간단한 보고서를 생성 합니다.The _RPT macros generate a simple report. _RPTF 매크로는 생성 된 보고서에서 보고서 매크로가 호출 된 소스 파일 및 줄 번호를 포함 합니다.The _RPTF macros include the source file and line number where the report macro was called in the generated report. 이러한 매크로의 와이드 문자 버전을 사용할 수 있습니다 ( _RPTW, _RPTFW).Wide character versions of these macros are available (_RPTW, _RPTFW). 와이드 문자 문자열이 모든 문자열 매개 변수 및 출력에 사용된다는 점을 제외하고 와이드 문자 버전은 반각 문자 버전과 똑같습니다.The wide character versions are identical to the narrow character versions except that wide character strings are used for all string parameters and output.

_ASSERT_EXPR, _ASSERT_ASSERTE 는 매크로 이며 crtdbg.h > 포함 <하 여 사용할 수 있지만 _debug 가 정의 되 면 응용 프로그램은 C 런타임 라이브러리의 디버그 버전과 연결 해야 합니다. 이러한 매크로는 다른 런타임 함수를 호출 합니다.Although _ASSERT_EXPR, _ASSERT and _ASSERTE are macros and are available by including <crtdbg.h>, the application must link with a debug version of the C run-time library when _DEBUG is defined because these macros call other run-time functions.

요구 사항Requirements

매크로Macro 필수 헤더Required header
_ASSERT_EXPR, _ASSERT, _ASSERTE_ASSERT_EXPR, _ASSERT, _ASSERTE <crtdbg.h><crtdbg.h>

예제Example

이 프로그램에서는 _ASSERT_ASSERTE 매크로를 호출 하 여 조건을 string1 == string2테스트 합니다.In this program, calls are made to the _ASSERT and _ASSERTE macros to test the condition string1 == string2. 조건이 실패하면 이들 매크로가 진단 메시지를 출력합니다.If the condition fails, these macros print a diagnostic message. 매크로의 _Rpt_RPTF 그룹은 printf 함수 대신이 프로그램 에서도 실행 됩니다.The _RPT and _RPTF group of macros is also exercised in this program, as an alternative to the printf function.

// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>

int main()
{
   char *p1, *p2;

   // The Reporting Mode and File must be specified
   // before generating a debug report via an assert
   // or report macro.
   // This program sends all report types to STDOUT.
   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
   _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
   _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);

   // Allocate and assign the pointer variables.
   p1 = (char *)malloc(10);
   strcpy_s(p1, 10, "I am p1");
   p2 = (char *)malloc(10);
   strcpy_s(p2, 10, "I am p2");

   // Use the report macros as a debugging
   // warning mechanism, similar to printf.
   // Use the assert macros to check if the
   // p1 and p2 variables are equivalent.
   // If the expression fails, _ASSERTE will
   // include a string representation of the
   // failed expression in the report.
   // _ASSERT does not include the
   // expression in the generated report.
   _RPT0(_CRT_WARN,
       "Use the assert macros to evaluate the expression p1 == p2.\n");
   _RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
   _ASSERT(p1 == p2);

   _RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
          p1, p2);
   _ASSERTE(p1 == p2);

   _RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);

   free(p2);
   free(p1);

   return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :

Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'

참고자료See also

디버그 루틴Debug Routines
assert Macro, _assert, _wassertassert Macro, _assert, _wassert
_RPT, _RPTF, _RPTW, _RPTFW 매크로_RPT, _RPTF, _RPTW, _RPTFW Macros