文档介绍:o尊S,91面霉
1
assert、NDEBUG f
语法概要 tinclude <> #i£ndef NDEBUG void assert( int expression ); #else #define assert(x) ((void)0) -—nd” assert宏带单个参数,可以是任何整数类型的值(许多实现允许任何标量类型)。如果这 个值为0,而不定义UDEBUG宏, 函数(标准C语言)或exit函数(传统C语言)终止程序。assert函数总是用宏实现,源文件 。诊断消息包括参数文本、文件名(_PILE_)和行 号(一 LINE_。C99实现还可以使用函数名(_func_。 ,则通常把assert定义为空语句,梅 assert功能关闭,不打印诊断消息,不求值assert的参数。 例 assert函数通常在程序开发期间用于验证某些条件在运行时是否为真。它向读程序的 人提供可靠的文档,并对调试大有帮助。程序可操作时,可以很容易地关闭断言,避免运行丑 销。下例中,断言是比英文注释还好的文档说明,可以避免误解: ■include <> int f(int x) { /* x should be between 1 and 10 */ /* !? */
assert(x>0 && x<10); ) [ 参考章节 abort ; exit ;〜func_ : LINE
system、exec 。
exit、abort
第i9章控制函数323
1 9. 4 setjmp> Iongjmp> jmp_buf 语法概要
#include<setjmp. h>
typedef ••• jmpbuf ;
int setjmp(imp buf env)o void longjmp(jmp buf env, int status)'
setjmp与longjmp函数实现基本形式的非本地跳转,可以处理异常或例外情形。这个 函
数比signal更好移植(见19. 6节),但后者也已经加进标准C语言中。
setjmp宏在“跳转缓冲区”参数eav中记录调用者的环境,exlv是个由实现定义的数 组,
并向调用者返回0(类型imp_bur要实现为数组类型,使ellv的指针实际传递到setjmp。
函数longjmp的参数为前面调用setjmp填充的跳转缓冲区和一个整型值status (通常 为
tlEO值)。调用longjmp的结果是程序再次从调用setjmp返回,这时返回status值。一些 实现冈
:包括标准C语言)不允许lon9: ]mp产生从setjmp返回0的结果,如果用status值0调 用
Xongjmp,则会从 setjmp 返回 1。
setjmp与longjmp函数的实现非常困难,编程人员最好别对其做太多假设。setjmp返 回
{乍。值时,编程人员可以假设调用1 ongjmp时静态变量具有适当的值。setjmp所在函数本 地的
自动变量在标准c语言中保证有正确值的条件