ASSERT 함수


assert 매크로 의 프로 토 타 입 정 의 는 < assert. h > 에 있 습 니 다. 그 역할 은 조건 이 잘못 되 돌아 오 면 프로그램 실행 을 중지 하 는 것 입 니 다. 프로 토 타 입 정의:  #include   void assert( int expression );  assert 의 역할 은 현재 계산 식 expression 입 니 다. 값 이 가짜 (즉 0) 라면 stderr 에 오류 정 보 를 인쇄 합 니 다.  그리고 abort 를 호출 하여 프로그램 실행 을 중지 합 니 다. 
http://www.chongtang.me/index.php/1419
프로그램의 건장 성 을 높이 는 assert 사용
정상적으로 실행 할 수 있 는 프로그램 을 만 드 는 것 은 매우 어렵다.잘못된 상황 에서 도 우아 함 을 표현 하 는 프로그램 을 만 드 는 것 이 더 어렵다.이 글 은 우리 가 실행 중인 프로그램 에서 오 류 를 일찍 발견 하고 검 측 하 며 문제 에서 회복 할 수 있 도록 프로 그래 밍 기술 에 대해 토론 할 것 이다.그럼 단언 (assert) 사용 부터 논의 해 보 자.
인 코딩 을 할 때 좋 은 목 표 는 항상 명심 해 야 합 니 다. 그것 은 bug 나 이상 한 오 류 를 가능 한 한 빨리 프로그램 다운 을 떨 어 뜨리 거나 오류 가 발생 하도록 방법 을 강구 해 야 합 니 다.개발 과 테스트 단계 에서 버그 를 빨리 찾 는 데 도움 이 되 기 때문이다.어떤 잘못 들 은 이유 없 이 자신 을 드 러 내지 않 고 종종 제품 이 고객 의 손 에 들 어가 야 이런 잘못 들 이 나타난다.
가장 간단 한 이상 조건 을 검사 하 는 방법 은 표준 C 의 assert 매크로 를 사용 하 는 것 입 니 다. 매개 변 수 는 bool 표현 식 입 니 다.표현 식 이 가짜 일 때 프로그램 이 종 료 됩 니 다.원본 파일, 줄 번호, 표현 식 자 체 를 포함 하여 종료 하기 전에 오류 메 시 지 를 인쇄 합 니 다.단언 은 매우 유용 하 다. 그것 은 프로그램 내부 에 작용 하 는 광범 위 한 일치 성 검사 방법 을 제공 했다.예 를 들 어 단언 테스트 함수 파라미터 의 유효성, 테스트 이상 의 반환 값 등 을 사용한다.
모든 단언 의 사용 은 프로그램 이 실 행 될 때의 조건 검 사 를 제공 할 뿐만 아니 라 소스 코드 등급 의 프로그램 조작 에 대한 설명 문서 와 도 같다.만약 당신 의 프로그램 에 단언 이 포함 되 어 있다 면, 즉 당신 의 소스 코드 를 읽 는 사람들 에 게 당신 의 소스 코드 에서 프로그램의 이 점 을 알려 주 는 것 입 니 다. 이 조건 은 진실 이 어야 합 니 다. 만약 진실 이 아니라면, 그것 은 bug 입 니 다.
물론 성능 을 추구 하 는 코드 에 서 는 assert 를 사용 하면 프로그램의 성능 을 떨 어 뜨 릴 수 있다.하지만 컴 파일 할 때 NDEBUG 매개 변수 컴 파일 러 를 추가 하면 assert 를 미리 처리 하여 제거 할 수 있 으 니 안심 하 세 요.미리 처리 할 때 assert 를 제거 할 수 있 기 때문에 사용 할 때 조심해 야 합 니 다.언제 쓰 느 냐, 언제 쓰 지 않 느 냐 가 문제 다.일반적으로 assert 내부 에서 함 수 를 호출 하거나 변 수 를 정의 하거나 값 을 바 꾸 는 조작 자 를 사용 해 서 는 안 됩 니 다. 예 를 들 어 +.
우 리 는 네가 이렇게 사용 했다 고 가정한다.
for (i = 0; i &lt;= 100; ++i) assert (do_something () == 0);

그리고 성능 을 크게 떨 어 뜨리 고 NDEGUG 인 자 를 혁신 적 으로 컴 파일 하 는 것 을 발견 할 수 있 습 니 다.이것 은 assert 매크로 전 체 를 제거 합 니 다. 이것 은 dosomething () 도 제거 되 었 습 니 다. 다 시 는 호출 되 지 않 습 니 다.잘못 을 바로 잡기 위해 서 는 이렇게 써 야 한다.
for (i = 0; i &lt;= 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 창 에서 변수 값 을 보고 오류 의 원인 을 찾 을 수 있 습 니 다.

좋은 웹페이지 즐겨찾기