Chapter 16 Standard Library

2020-03-02  本文已影响0人  再凌

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

SIGINTSIGTERM是负责控制外部中断的信号量,通常我们对一个进行善后处理,一个作为直接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. 数组地址
  2. 元素数量
  3. 元素大小
  4. 比较方法(返回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

解决了世界不同地区对于小数描述方法,字母排序问题的差异,在此不做赘述

上一篇下一篇

猜你喜欢

热点阅读