前言:
libc库线程安全函数的易用性封装。
问题:
libc有如下两个时间相关函数 :
char *asctime(const struct tm *ptm) char *asctime_r(const struct tm *ptm, char *buffer)其中asctime是非线程安全函数(MT-Unsafe),但是用起来简单方便,一条语句就可以搞定,如
printf("%s", asctime(&tm)); //or strcpy(dst, asctime(&tm));而使用asctime_r则需要额外定义一个变量,用起来差那么点意思
char tmpbuf[64] = {0}; printf("%s", asctime_r(&tm, tmpbuf)); //or strcpy(dst, asctime_r(&tm, tmpbuf));那么有没有一种函数接口设计可以保持asctime_r的安全特性又可以保留asctime的易用性
方案:
这种函数接口需要解决两个小问题
1、需要有返回值
由于asctime_r是系统libc函数,应用开发过程中肯定是不能对其进行修改的,因此引入带返回值的宏来实现
#define myprefix_asctime(tp) \ ({ \ tmpbuf \ asctime_r(tp, tmpbuf); \ tmpbuf \ })但返回值宏其他使用示例参见