Assert 매크로의 프로토타입은 b0f0cbacb9a934b30cb1dd71186a65c7에 정의되어 있습니다. 해당 기능은 조건이 오류를 반환하는 경우 프로그램 실행을 종료하는 것입니다. 프로토타입 정의:
#include <assert.h> void assert( int expression );
Assert의 기능 현재 Expression을 계산하는 것입니다. 값이 false(즉, 0)이면 먼저 stderr에 오류 메시지를 인쇄한 다음 abort를 호출하여 프로그램을 종료합니다. 다음 프로그램 목록 badptr.c를 참조하세요.
#include <stdio.h> #include <assert.h> #include <stdlib.h> int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //所以这里出错 fclose( fp ); //程序永远都执行不到这里来 return 0; }
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a. out: badptr.c:14: main: Assertion `fp'가 실패했습니다.
Assert() 사용의 단점은 빈번한 호출이 프로그램 성능에 큰 영향을 미치고 추가 오버헤드를 추가한다는 것입니다. 디버깅 후 #include b0f0cbacb9a934b30cb1dd71186a65c7가 포함된 문 앞에 #define NDEBUG를 삽입하여 Assert 호출을 비활성화할 수 있습니다. 샘플 코드는 다음과 같습니다.
#include <stdio.h> #define NDEBUG #include <assert.h>
사용 요약 및 주의 사항:
1)
int resetBufferSize(int nNewSize) { //功能:改变缓冲区大小, //参数:nNewSize 缓冲区新长度 //返回值:缓冲区当前长度 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ... }
과 같이 함수 시작 부분에서 들어오는 매개 변수의 적법성을 확인합니다. 2) 여러 조건을 동시에 테스트할 때 각각의 Assert는 하나의 조건만 테스트합니다. , 어설션이 실패하면 어떤 조건이 실패했는지 직관적으로 판단할 수 없습니다. 예:
나쁨:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
좋음:
assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize);
3) 변경되는 문 어설션은 DEBUG에서만 적용되므로 환경을 사용할 수 없습니다. 이렇게 하면 프로그램이 실제로 실행될 때 다음과 같은 문제가 발생합니다.
오류:
assert(i++ < 100);
이는 실행 전 i=100과 같은 오류가 발생하면 이 명령문이 실행되지 않고 i++ 명령도 실행되지 않기 때문입니다.
정답:
assert(i < 100); i++;
4) Assert 및 후속 문은 논리적, 시각적 일관성을 유지하기 위해 빈 줄에 있어야 합니다.
5) 일부 장소에서는 Assert가 조건부 필터링을 대체할 수 없습니다.
위 내용은 Assert() 함수의 사용법을 요약한 것입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!