ASSERT 함수
assert 매크로 의 프로 토 타 입 정 의 는 < assert. h > 에 있 습 니 다. 그 역할 은 조건 이 잘못 되 돌아 오 면 프로그램 실행 을 중지 하 는 것 입 니 다. 프로 토 타 입 정의: #include
http://www.chongtang.me/index.php/1419
프로그램의 건장 성 을 높이 는 assert 사용
정상적으로 실행 할 수 있 는 프로그램 을 만 드 는 것 은 매우 어렵다.잘못된 상황 에서 도 우아 함 을 표현 하 는 프로그램 을 만 드 는 것 이 더 어렵다.이 글 은 우리 가 실행 중인 프로그램 에서 오 류 를 일찍 발견 하고 검 측 하 며 문제 에서 회복 할 수 있 도록 프로 그래 밍 기술 에 대해 토론 할 것 이다.그럼 단언 (assert) 사용 부터 논의 해 보 자.
인 코딩 을 할 때 좋 은 목 표 는 항상 명심 해 야 합 니 다. 그것 은 bug 나 이상 한 오 류 를 가능 한 한 빨리 프로그램 다운 을 떨 어 뜨리 거나 오류 가 발생 하도록 방법 을 강구 해 야 합 니 다.개발 과 테스트 단계 에서 버그 를 빨리 찾 는 데 도움 이 되 기 때문이다.어떤 잘못 들 은 이유 없 이 자신 을 드 러 내지 않 고 종종 제품 이 고객 의 손 에 들 어가 야 이런 잘못 들 이 나타난다.
가장 간단 한 이상 조건 을 검사 하 는 방법 은 표준 C 의 assert 매크로 를 사용 하 는 것 입 니 다. 매개 변 수 는 bool 표현 식 입 니 다.표현 식 이 가짜 일 때 프로그램 이 종 료 됩 니 다.원본 파일, 줄 번호, 표현 식 자 체 를 포함 하여 종료 하기 전에 오류 메 시 지 를 인쇄 합 니 다.단언 은 매우 유용 하 다. 그것 은 프로그램 내부 에 작용 하 는 광범 위 한 일치 성 검사 방법 을 제공 했다.예 를 들 어 단언 테스트 함수 파라미터 의 유효성, 테스트 이상 의 반환 값 등 을 사용한다.
모든 단언 의 사용 은 프로그램 이 실 행 될 때의 조건 검 사 를 제공 할 뿐만 아니 라 소스 코드 등급 의 프로그램 조작 에 대한 설명 문서 와 도 같다.만약 당신 의 프로그램 에 단언 이 포함 되 어 있다 면, 즉 당신 의 소스 코드 를 읽 는 사람들 에 게 당신 의 소스 코드 에서 프로그램의 이 점 을 알려 주 는 것 입 니 다. 이 조건 은 진실 이 어야 합 니 다. 만약 진실 이 아니라면, 그것 은 bug 입 니 다.
물론 성능 을 추구 하 는 코드 에 서 는 assert 를 사용 하면 프로그램의 성능 을 떨 어 뜨 릴 수 있다.하지만 컴 파일 할 때 NDEBUG 매개 변수 컴 파일 러 를 추가 하면 assert 를 미리 처리 하여 제거 할 수 있 으 니 안심 하 세 요.미리 처리 할 때 assert 를 제거 할 수 있 기 때문에 사용 할 때 조심해 야 합 니 다.언제 쓰 느 냐, 언제 쓰 지 않 느 냐 가 문제 다.일반적으로 assert 내부 에서 함 수 를 호출 하거나 변 수 를 정의 하거나 값 을 바 꾸 는 조작 자 를 사용 해 서 는 안 됩 니 다. 예 를 들 어 +.
우 리 는 네가 이렇게 사용 했다 고 가정한다.
for (i = 0; i <= 100; ++i) assert (do_something () == 0);
그리고 성능 을 크게 떨 어 뜨리 고 NDEGUG 인 자 를 혁신 적 으로 컴 파일 하 는 것 을 발견 할 수 있 습 니 다.이것 은 assert 매크로 전 체 를 제거 합 니 다. 이것 은 dosomething () 도 제거 되 었 습 니 다. 다 시 는 호출 되 지 않 습 니 다.잘못 을 바로 잡기 위해 서 는 이렇게 써 야 한다.
for (i = 0; i <= 100; ++i) { int status = do_something (); assert (status == 0); }
또 잘못된 입력 을 assert 로 검사 하지 말 라 는 점 을 명심 해 야 한다.사용 자 는 입력 할 때 프로그램 을 직접 종료 하 는 것 을 좋아 하지 않 습 니 다. 입력 오류 라 도 프로그램 에 우호 적 인 응답 이 있 는 것 이 좋 습 니 다.따라서 잘못된 입력 을 검사 하고 유용 한 알림 정 보 를 출력 해 야 합 니 다.프로그램 실행 중 내부 검 사 를 할 때 만 단언 을 사용 합 니 다.
여기 서 프로그램 에서 assert 를 사용 하 는 것 이 좋 은 곳 을 알려 드 리 겠 습 니 다.
(1) 빈 포인터 검사.예 를 들 어 함수 의 매개 변 수 를 대상 으로 빈 지침 검 사 를 한다.이렇게 사용 할 수 있 습 니 다: assert (pointer! = NULL);,발생 하 는 오 류 는 다음 과 같 습 니 다: Assertion 'pointer! =((void *)0)’ failed。이렇게 하면 빈 포인터 가 나타 나 면 프로그램 이 종료 되 고 오류 메 시 지 를 잘 보 냅 니 다.
(2) 함수 매개 변수의 값 을 검사 합 니 다.예 를 들 어 하나의 함수 가 하나의 인자 foo 가 플러스 일 때 만 호출 된다 면 함수 가 시 작 될 때 이렇게 쓸 수 있 습 니 다: assert (foo > 0).이것 은 함수 의 오 류 를 검사 하 는 데 도움 을 줄 것 입 니 다. 이것 은 소스 코드 열독 자 에 게 도 뚜렷 한 인상 을 줄 것 입 니 다. 그것 은 바로 여기 서 함수 의 매개 변수 값 에 제한 이 있 습 니 다.
이렇게 많이 말 했 으 니 행동 해라. 대담 하 게 너의 프로그램 에서 단언 을 사용 해라.
http://www.programfan.com/blog/article.asp?id=10284
--------------------------------------------------------------- ASSERT () 는 디버그 프로그램 에서 자주 사용 하 는 매크로 입 니 다. 프로그램 이 실 행 될 때 괄호 안에 있 는 표현 식 을 계산 합 니 다. 표현 식 이 FALSE 라면. (0), 프로그램 은 오 류 를 보고 하고 실행 을 중지 합 니 다.표현 식 이 0 이 아니라면 뒤의 문 구 를 계속 실행 합 니 다.이 매크로 는 일반적으로 프로그램 에 현저 한 불법 데이터 가 있 는 지 여 부 를 판단 하 는데 만약 에 종료 프로그램 이 심각 한 결 과 를 초래 하지 않도록 하 는 동시에 오 류 를 찾기 도 편리 하 다. ASSERT 는 Debug 버 전에 서 만 유효 하 며 Release 버 전 으로 컴 파일 되면 무시 된다. --------------------------------------------------------------- ASSERT 매크로 정 의 는 다음 과 같 습 니 다. #define ASSERT(f) \ do \ { \ if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \ AfxDebugBreak(); \ } while (0) \ ASSERT (논리 식) 괄호 안의 논리 표현 식 값 이 가짜 라면 디 버 깅 명령 창 이 팝 업 됩 니 다. 어떤 파일 의 줄 에 단언 오류 가 발생 했 는 지 알려 줍 니 다! --------------------------------------------------------------- ASSERT Evaluates an expression, and displays a diagnostic message if the expression is FALSE. Ignored in retail builds. Syntax ASSERT( cond ); Parameters cond Expression to evaluate. Remarks In debug builds, if the expression is FALSE, this macro displays a message box with the text of the expression, the name of the source file, and the line number. The user can ignore the assertion, enter the debugger, or quit the application. Example ASSERT(rtStartTime <= rtEndTime); --------------------------------------------------------------- 단언 (ASSERT) 의 사용 방법 은 매우 간단 하 다. 왜 사용 해 야 하 는 지 초보 자 들 은 비교적 혼 란 스 러 울 수 있다. 계약 식 프로 그래 밍 은 비교적 명확 하 게 말 하 니, 먼저 이런 종류의 책 을 볼 수 있 는 것 을 건의 합 니 다. 하나의 함 수 는 선행 조건, 선행 조건 과 불변 식 으로 구성 되 어 있 습 니 다. VC 에서 우 리 는 단언 을 통 해 이 세 가지 조건 을 보증 할 수 있 습 니 다. 소프트웨어 의 질 을 크게 향상 시 킬 수 있 습 니 다. --------------------------------------------------------------- 만약 ASSERT () 중의 조건 이 성립 되 지 않 는 다 면 (예 를 들 어 ASSERT(0) ; ),비교적 무 서운 대화 상자 가 팝 업 됩 니 다. 클릭 하여 다시 시도 하면 도착 할 수 있 습 니 다. ASSERT 성립 되 지 않 는 다 고 단언 하 는 그 줄 은 이 때 watch 창 에서 변수 값 을 보고 오류 의 원인 을 찾 을 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.