다음을 통해 공유


_ASSERT, _ASSERTE 매크로

결과가 False 일 때 식을 평가하고 디버그 보고서를 생성합니다.

_ASSERT( 
   booleanExpression 
);
_ASSERTE( 
   booleanExpression 
);

매개 변수

  • booleanExpression
    0이 아닌 값 또는 0으로 계산된 식(포인터 포함)입니다.

설명

_ASSERT 및 _ASSERTE 매크로는 디버깅 프로세스 동안 가정 검사를 위한 명료하고 간단한 메커니즘과 함께 응용 프로그램을 제공합니다. 이들은 응용 프로그램의 정식 버전 빌드에서의 호출로부터 대비하기 위한 #ifdef 문에서 묶어야 할 필요가 없으므로 매우 유연 합니다. 이러한 유연성은 _DEBUG 매크로를 사용하여 얻게됩니다. _ASSERT 및 _ASSERTE 은 _DEBUG 가 정의된 경우에만 사용할 수 있습니다. _DEBUG 가 정의되지 않았을 때, 이러한 매크로를 호출하면 전처리시기에 제거됩니다.

_ASSERT 및 _ASSERTE 은 그들의 booleanExpression 인수를 평가하고 결과가 false (0) 일 때, 진단 메시지를 출력하고 _CrtDbgReportW 을 호출하여 디버그 보고서를 생성합니다. _ASSERTE 가 메세지에서 실패한 식의 문자열을 포함하는 동안 _ASSERT 매크로는 간단한 진단 메시지를 출력합니다. 이러한 매크로는 booleanExpression 가 0이 아닌 값일때 아무 작업도 수행 하지 않습니다.

_ASSERT 및 _ASSERTE 은 모든 출력을 와이드 문자로 만드는 _CrtDbgReportW 을 호출하고, _ASSERTE 은 booleanExpression 에 유니코드 문자를 제대로 출력합니다.

_ASSERTE 매크로는 생성된 보고서에서 실패한 식을 지정하기 때문에 사용자는 응용 프로그램 소스 코드를 참조 하지 않고도 문제를 식별할 수 있습니다. 그러나 _ASSERTE 에 의해 계산된 모든 식에서의 단점은 응용 프로그램의 출력 (디버그 버전) 파일에 문자열 상수로 포함 됩니다. 따라서 _ASSERTE 이 많이 호출된 경우, 이 식은 출력 파일의 크기를 크게 키울 수 있습니다.

별도의 _CrtSetReportMode_CrtSetReportFile 기능을 지정 하지 않으면, 기능 설정에 해당하는 팝업 대화 상자에 메시지가 나타납니다.

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReport 또는 _CrtDbgReportW 는 디버그 보고서를 생성 하고 현재 보고서 모드 및 _CRT_ASSERT 보고서 종류를 위해 정의된 파일에 따라 해당 대상을 결정합니다. 기본적으로 어설션 실패 및 오류는 디버그 메시지 창으로 이동합니다. _CrtSetReportMode_CrtSetReportFile 함수들은 각 보고서 형식에 대한 대상을 정의하기 위해 사용됩니다.

대상이 디버그 메시지창이고 사용자가 재시도 버튼을 클릭할 때, _CrtDbgReport 또는 _CrtDbgReportW 이 1을 반환하고, 디버깅을 시작하기 위해 _ASSERT 및 _ASSERTE 매크로를 시작하며, 적시(JIT) 디버깅이 활성화됩니다.

보고 프로세스에 대한 자세한 내용은 _CrtDbgReport, _CrtDbgReportW 함수를 참조하십시오. 어설션 오류를 해결 및 이러한 매크로를 디버깅 오류 처리 메커니즘으로 사용하는 방법에 대한 자세한 내용은 확인 및 보고에 대한 매크로 사용 을 참조하십시오.

_RPT, _RPTF 디버그 매크로는 디버그 보고서를 생성하는데 사용될 수 있지만, 표현식을 평가하진 않습니다. _RPT 매크로는 간단한 보고서를 생성 합니다. _RPTF 매크로는 생성된 보고서에서 보고서 매크로를 호출한 소스 파일 및 줄 번호를 포함 합니다. _ASSERTE 매크로 이외에 ANSI assert 루틴은 프로그램 논리를 확인하기 위해 사용될 수 있습니다. 이 루틴은 라이브러리의 디버그 버전과 릴리스 버전에서 사용할 수 있습니다. 이러한 매크로의 와이드 문자 버전은 사용할 수 있습니다 (_RPTWn, _RPTFWn). 와이드 문자 버전은 와이드 문자 문자열이 모든 문자열 매개 변수 및 출력으로 사용되는 것을 제외하곤 좁은 문자 버전과 동일합니다.

비록 _ASSERT 및 _ASSERTE 매크로는 Crtdbg.h를 포함하여 얻게되지만, 응용프로그램은 이 매크로가 다른 런타임 함수들을 호출하기 때문에 다음 라이브러리들 중 하나를 사용하여 연결해야 합니다.

  • Libcmtd.lib
    다중 스레드 정적 라이브러리, 디버그 버전.

  • Msvcrtd.lib
    Msvcr90d.dll, 디버그 버전의 라이브러리를 가져옵니다.

요구 사항

매크로

필수 헤더

_ASSERT

<crtdbg.h>

_ASSERTE

<crtdbg.h>

예제

이 프로그램에서 _ASSERT_ASSERTE 매크로에 대한 호출이 생성되어 string1 == string2 조건을 검사합니다. 조건이 실패 한 경우, 이러한 매크로들은 진단 메시지를 출력합니다. 또한 _RPTn_RPTFn 매크로 그룹은 이 프로그램에서 printf 함수 대신으로 실행됩니다.

// 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;
}
  

해당 .NET Framework 항목

System::Diagnostics::Debug:: 어설션

참고 항목

참조

디버그 루틴

_RPT, _RPTF, _RPTW, _RPTFW 매크로