어설션
업데이트: 2007년 11월
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
네이티브 전용 |
|||
Standard |
네이티브 전용 |
|||
Pro 및 Team |
네이티브 전용 |
표의 범례:
해당 |
|
해당 없음 |
|
명령은 기본적으로 숨겨져 있습니다. |
어설션 문은 프로그램의 특정 지점에서 true를 유지하도록 조건을 지정합니다. 조건이 true를 유지하지 않으면 어설션 오류가 발생하고 프로그램 실행이 중단되며 어설션 오류 대화 상자가 나타납니다.
Visual C++에서는 다음 구문을 기반으로 하는 어설션 문을 지원합니다.
MFC 프로그램용 MFC 어설션
ATL을 사용하는 프로그램용 ATLASSERT
C 런타임 라이브러리를 사용하는 프로그램용 CRT 어설션
기타 C/C++ 프로그램용 ANSI assert function
어설션을 사용하여 다음과 같은 작업을 할 수 있습니다.
논리 오류 찾기. 자세한 내용은 논리 오류 찾기를 참조하십시오.
작업의 결과 확인. 자세한 내용은 결과 확인을 참조하십시오.
처리해야 할 오류 조건 테스트. 자세한 내용은 오류 조건 테스트를 참조하십시오.
MFC 및 C 런타임 라이브러리 어설션
MFC나 C 런타임 라이브러리 어설션으로 인해 디버거가 중지되면 디버거는 소스 파일에서 어설션이 발생한 지점을 탐색합니다(소스 파일이 있는 경우). 어설션 오류 대화 상자와 출력 창에 어설션 메시지가 나타납니다. 어설션 메시지를 출력 창에서 텍스트 창으로 복사해 저장하면 나중에 참조할 수 있습니다. 출력 창에 다른 오류 메시지가 있는 경우도 있습니다. 이 메시지를 주의 깊게 검토하면 어설션 오류의 원인을 찾을 수 있습니다.
어설션을 코드에 자유롭게 사용하면 프로그램을 개발할 때 많은 오류를 찾아낼 수 있습니다. 가정한 내용마다 어설션을 작성하는 것이 좋습니다. 예를 들어, 인수가 NULL이 아니라고 생각되면 어설션 문을 사용하여 확인하십시오.
_DEBUG
어설션 문은 _DEBUG가 정의된 경우에만 컴파일합니다. _DEBUG가 정의되지 않은 경우 컴파일러는 어설션을 null 문으로 처리합니다. 따라서 최종판 프로그램에서 어설션 문은 오버헤드가 0이므로, 릴리스 버전 성능에 영향을 주거나 #ifdef 지시문을 사용하지 않고도 코드에 자유롭게 사용할 수 있습니다.
어설션 사용으로 인한 의도하지 않은 연산
코드에 어설션을 추가할 경우 어설션에 의도하지 않은 연산이 없는지 확인하십시오. 예를 들어, 다음 어설션을 확인하십시오.
ASSERT(nM++ > 0); // Don't do this!
프로그램의 릴리스 버전에서는 ASSERT 식을 계산하지 않기 때문에 디버그 버전과 릴리스 버전에서 nM의 값이 다릅니다. MFC에서는 ASSERT 대신 VERIFY 매크로를 사용할 수 있습니다. 릴리스 버전에서 VERIFY는 식을 계산하지만 결과를 확인하지는 않습니다.
함수를 계산할 때 예기치 않은 의도하지 않은 연산이 발생할 수 있으므로 어설션 문에서 함수를 호출할 때는 특히 주의하십시오.
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
VERIFY는 디버그 버전과 릴리스 버전에서 모두 myFnctn을 호출하기 때문에 사용이 가능합니다. 그러나 릴리스 버전에서는 여전히 불필요한 함수 호출의 오버헤드가 발생하게 됩니다.