概述
今天写一个日志类,不过目前还有bug。condition的destroy不知道怎么的死锁了,之前测试很好的,并入其他模块就不能工作了,我得想办法调试一下,毕竟多线程程序不好调试。
先来分析一下今天用的这几个函数,其实以前看libevent,muduo这些函数都出现过,不过学了又忘了,这次总结一下。
1.valist
C语言标准库中头文件stdarg.h声明了一组能够变长参数的宏。主要有:
1、va_list 用来声明一个表示参数表中各个参数的变量。
2、va_start 初始化一个指针来指向变长参数列表的头一个变量(注意,...只能出现在参数表的最后)
3、va_arg每次调用时都会返回当前指针指向的变量,并将指针挪至下一个位置,参数的类型需要在这个调用的第二个参数来指定,va_arg也是根据这个参数来判断偏移的距离。
4、va_end需要在函数最后调用,来进行一些清理工作。
示例:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void print(const char* format, ...)
{
va_list vlist;
va_start(vlist, format);
char buf[1024];
memset(buf, 0, sizeof(buf));
vsprintf(buf, format, vlist);
printf("%sn", buf);
va_end(vlist);
}
int main()
{
const char *s1 = "hello,";
const char *s2 = "world.";
print("%s%s", s1, s2);
return 0;
}
在本例中,便可输出"hello,world."
2.snprintf
snprintf(),为函数原型int snprintf(char *str, size_t size, const char *format, ...)。
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('