c assert assertion handling c with examples
이 C ++ Assert 자습서는 프로그래머가 만든 프로그램의 가정을 테스트하기위한 명령문 인 C ++의 Assertion에 대해 설명합니다.
네트워킹 문제 해결 인터뷰 질문 및 답변 pdf
C ++ 프로그램에서는 일반적으로 배열 인덱스가 0보다 커야한다고 가정합니다.
이러한 가정이 이루어지면 프로그램은 잘 실행되지만 이러한 가정이 거짓이되면 프로그램은 정상적으로 종료되지 않습니다.
=> 전문가의 전체 C ++ 과정을 보려면 여기를 방문하십시오.
학습 내용 :
C ++의 어설 션
assert는 위에서 설명한 것과 같은 조건을 테스트하는 C ++의 명령문입니다. 조건이 참이면 프로그램이 정상적으로 계속되고 조건이 거짓이면 프로그램이 종료되고 오류 메시지가 표시됩니다.
assert 전 처리기 매크로를 사용하여 assertion을 제공 할 수 있습니다.
myInt 정수를 사용하면 다음과 같이 myInt가> 0이어야한다는 단언을 선언 할 수 있습니다.
assert (myInt > 0);
지정된 myInt 값이 -1이라고 가정하면 myInt 값이 -1이므로 컴파일러가 위의 문을 만날 때 어설 션이 실패합니다. 어설 션이 실패하면 프로그램 이름 및 라인 번호와 함께 유효하지 않은 어설 션을 나타내는 메시지가 발행되고 프로그램이 종료됩니다.
assert의 일반적인 프로토 타입은 다음과 같습니다.
assert (조건) where condition => 스칼라 유형의 표현식
어설 션은 조건식을 평가하는 데 사용되는 전 처리기 매크로입니다. 조건식이 거짓으로 평가되면 오류 메시지를 표시 한 후 프로그램이 종료됩니다. 오류 메시지는 일반적으로 실패한 조건식, 코드 파일 이름 및 어설 션의 줄 번호로 구성됩니다.
따라서 문제가 발생한 위치와 코드에서 발생한 문제를 알 수 있습니다. 따라서 어설 션을 사용하면 디버깅이 더 효율적입니다.
C ++ 헤더< 캐서 트 >는 assert 기능을 포함합니다. 우리는 주로 코드에서 assert 기능을 사용하여 함수에 전달 된 매개 변수가 유효한지 확인하고, 함수의 반환 값을 확인하거나, 배열 경계를 확인합니다.
C ++ Assertion의 기본 예.
#include #include using namespace std; void display_number(int* myInt) { assert (myInt!=NULL); cout<<'myInt contains value' << ' = '<<*myInt< 산출:

위 프로그램에서는 display_number 함수에 (myInt! = NULL) 표현식을 포함하는 assert 호출을 사용했습니다. 먼저 main 함수에서 myptr 변수의 주소를 포함하는 포인터 변수 second_ptr을 전달합니다. 이 호출이 이루어지면 어설 션이 참입니다. 따라서 프로그램 실행은 정상이며 값이 표시됩니다.
display_number에 대한 두 번째 호출에서 null 포인터를 전달하여 assert false를 만듭니다. 따라서 두 번째 호출이 이루어지면 어설 션 실패 메시지가 출력과 같이 표시됩니다.
NDEBUG로 어설 션 비활성화
어설 션을 사용하면 런타임에 확인됩니다. 어설 션은 디버깅을 효율적으로 만들지 만 애플리케이션의 릴리스 빌드에 어설 션을 포함하지 않도록주의해야합니다. 이는 우리가 응용 프로그램을 출시 할 때 응용 프로그램이 철저히 테스트되었음을 확신 할 때만 수행한다는 것을 알고 있기 때문입니다.
따라서 소프트웨어를 출시 할 때 모든 어설 션을 비활성화해야합니다. NDEBUG 매크로를 사용하여 프로그램에서 어설 션을 비활성화 할 수 있습니다. 프로그램에서 NDEBUG 매크로를 사용하면 assert에 대한 모든 호출이 비활성화됩니다.
모든 assert 문을 비활성화하기 위해 프로그램에 아래 줄을 포함 할 수 있습니다.
#define NDEBUG
다음 C ++ 프로그램은 NDEBUG가 주석 처리 될 때와 NDEBUG가 활성화 될 때 프로그램이 어떻게 작동하는지 보여줍니다.
# 1) NDEBUG가 지정되었지만 주석 처리되었습니다.
#include // uncomment to disable assert() //#define NDEBUG #include using namespace std; int main() { assert(2+2==3+1); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); cout << 'Asset disabled...execution continuous with invalid expression
'; }
산출:
토렌트 파일을 여는 방법

이 프로그램에서는 #define NDEBUG 문을 지정했지만 주석 처리되었습니다. 이것은 assert 문이 활성 상태임을 의미합니다. 따라서 프로그램이 실행될 때 assert에 대한 두 번째 호출은 false를 반환하고 오류 메시지가 깜박이고 프로그램이 중단됩니다.
# 2) NDEBUG가 활성화되었습니다.
#include // uncomment: assert() disabled #define NDEBUG #include using namespace std; int main() { assert(2+2==3+1); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); cout << 'Assert disabled...execution continuous with invalid expression
'; }
산출:

이 프로그램에서는 NDEBUG 매크로의 주석 처리를 제거했습니다. 이제 프로그램을 실행하면 assert 문이 더 이상 활성화되지 않습니다. 따라서 프로그램은 assert 문의 두 번째 조건이 거짓 인 경우에도 정상적인 실행을 계속합니다.
따라서 #define NDEBUG 줄의 주석 처리를 제거하여 프로그램에서 assert 문을 비활성화했습니다.
Assert 및 static_assert
지금까지 본 주장은 런타임에 실행됩니다. C ++는 static_assert로 알려진 또 다른 형태의 어설 션을 지원하며 컴파일 타임 어설 션 검사를 수행합니다. C ++ 11부터 존재합니다.
static_assert에는 다음과 같은 일반 구문이 있습니다.
static_assert (bool_constexpr, message)
여기 bool_constexpr => c 컨텍스트 적으로 bool 유형의 상수 표현식을 변환했습니다.
Message => bool_constexpr이 false 인 경우 오류 메시지로 표시되는 문자열입니다.
따라서 bool_constexpr이 true로 평가되면 프로그램이 정상적으로 진행됩니다. bool_constexpr이 false로 평가되면 컴파일러 오류가 발생합니다.
아래 프로그램은 C ++ 프로그램에서 static_assert의 사용법을 보여줍니다.
#include #include using namespace std; int main() { assert(2+2==3+1); static_assert(2+2==3+1, '2+2 = 3+1'); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); static_assert(2+2==1+1, '2+2 != 1+1'); cout << 'Assert disabled...execution continuous with invalid expression
'; }
산출:

위의 프로그램에서 우리는 표현식과 메시지와 함께 static_assert를 제공했습니다. 실패하면 출력에 표시된대로 컴파일러 오류가 발행됩니다.
자주 묻는 질문
Q # 1) C ++에서 Assert 란 무엇입니까?
대답: C ++의 assert는 프로그램에 설정된 특정 가정을 테스트 할 수있는 미리 정의 된 매크로입니다. assert 문의 조건식이 true로 설정되면 프로그램이 정상적으로 계속됩니다. 그러나 표현식이 거짓이면 오류 메시지가 발생하고 프로그램이 종료됩니다.
Q # 2) static_assert 란 무엇입니까?
대답: Static_assert는 런타임에 평가되는 assert () 문에 대해 컴파일 타임에 평가됩니다.
Static_assert는 C ++ 11부터 C ++에 통합되었습니다. 조건식과 메시지가 인수로 표시됩니다. 조건이 거짓으로 평가되면 컴파일러 오류가 발생하고 메시지가 표시됩니다. 그런 다음 프로그램이 종료됩니다.
Q # 3) assert () 매크로의 목적은 무엇인가요?
다음 중 팀의 책임이 아닌 것은 무엇입니까?
대답: Assert () 매크로는 프로그램에서 발생하지 않아야하는 조건이나 가정을 테스트하는 데 사용됩니다. 예를 들면 배열 인덱스는 항상> 0이어야합니다. 또 다른 가정은 2 + 2 == 3 + 1이 될 수 있습니다.
따라서 assert ()를 사용하여 이러한 가정을 테스트 할 수 있으며 이것이 참으로 평가되는 한 프로그램이 정상적으로 실행됩니다. 거짓이면 프로그램이 종료됩니다.
결론
이 튜토리얼에서는 C ++에서 assert () 문이 작동하는 것을 보았습니다. assert () 문은 헤더에 정의되어 있습니다. NDEBUG 매크로를 사용하여 assert를 비활성화 할 수 있습니다. 개발자는 프로덕션 코드가 철저하게 테스트되고 버그가 없을 것으로 예상되므로 assert를 프로덕션 코드에서 사용할 수 없도록주의해야합니다.
assert () 문 외에도 C ++ 11은 컴파일 타임에 평가되는 static_assert ()도 지원합니다. static_asset ()가 false로 평가되면 컴파일러 오류가 발생하고 프로그램이 종료됩니다.
어설 션은 프로그램에서 가정을 테스트하는 방법이며 어설 션 내부의 조건식을 평가하여 프로그램을 철저히 테스트 할 수 있으며 디버그가 더 효율적입니다.
추천 도서