setjmp.h
用于实现类似于goto
语句的效果
在成为top-level的地方使用
int setjmp( jum_buf state)
setjmp会将程序的各种状态保存在State中,返回成功值0
后续代码中跳转采用
void longjmp( jump_buf state, int value)
此时setjmp会被再次调用,返回的值为value
当然,普通的return也可以达到相同效果,不过如果调用链很长,而且各层的return值都已经被使用的话,每一层都检查是否有error自然会变得很困难。
signal.h
SIGINT
和SIGTERM
是负责控制外部中断的信号量,通常我们对一个进行善后处理,一个作为直接abort处理。
int raise( int sig );
可以直接测试信号量
void ( *signal( int sig, void ( *handler ) ( int ))) ( )
sig是准备应答的信号量,handler指向一个处理的句柄函数,这个函数接受一个 int 类型的参数,这个参数描述了传入的是什么信号量。(这也就意味着,一个处理函数可以处理多个信号量的唤起)
一般来说,handlers里的函数只能处理少数几个变量(同时这个变量必须声明为volatile类型),以防止造成更大的错误
execution environment
atexit( void (func) ( void ));
将函数挂载到exit()函数的执行队列中
exit()的退出是正常退出,会清理各种打开的文件等;abort()是直接退出,不进行任何善后
assert.h
void assert ( int expression)
如果expression为假,会打印标准错误、行数并退出程序,否则无事发生
assert是宏命令,因此通过#define NDEBUG
可以关闭断言功能
stdlib.h--qsort,bsearch
void qsort( void *base, size_t n_element, size_t el_size, int (*compare)( void const *, void const *))
这个函数可以比较任何类型的变量,需要提供:
- 数组地址
- 元素数量
- 元素大小
- 比较方法(返回1前比后大,0相等,-1前比后小)
因为传入的数据都是void类型,因此需要显式转换
void *bearch( void const *key, void const *base,size_t n_elements, size_t el_size, int (*compare)( void const *, void const *))
使用二分法去搜寻一个已经排序好的数组
注意,*key
必须和base里的元素是同一类型
locale.h
解决了世界不同地区对于小数描述方法,字母排序问题的差异,在此不做赘述
网友评论