(个人备忘录)C语言的变参函数。
参考文献:
1.0 嵌入式C语言自我修养 08:变参函数的格式检查
1.1 C语言中文参考手册(vprintf_s)
1.简单应用
/*
* Ausart.c
*
* Created on: 2020年1月13日
* Email: linxch2018@163.com
* Author: xclin
*/
#include <stdio.h>
#include <stdarg.h>
void my_printf(char *fmt,...)
{
va_list args;
va_start(args,fmt);//解析:根据参数 fmt 的地址,获取 fmt 后面参数的地址,并保存在 args 指针变量中。
vprintf(fmt,args);//打印:解析后的变参列表,直接传递给 vprintf 函数,实现打印功能。
va_end(args);//释放:释放 args 指针,
}
int buf_printf(const char *fmt,...)
{
va_list args1;
va_list args2;
va_start(args1, fmt);
va_copy(args2, args1);
char buf[1+vsnprintf(NULL, 0, fmt, args1)];
va_end(args1);
vsnprintf(buf, sizeof buf, fmt, args2);
va_end(args2);
printf("%s",buf);
}
int main(void)
{
int num = 112;
my_printf("I am xclin, This is a number :%d\n", num);
buf_printf("Testing format conversion to *buf");
return 0;
}
/*
int sprintf(char *buf,const char *fmt,...)
{
int len;
va_list va;
va_start(va,fmt);
len = vsprintf(buf,fmt,va);
va_end(va);
return len;
}
*/
2.添加引用时间及指定其格式
/*
* Ausart.c
*
* Created on: 2020年1月13日
* Email: linxch2018@163.com
* Author: xclin
*/
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
void debug_log(const char *fmt, ...){
struct timespec ts;
timespec_get(&ts, TIME_UTC);
char time_buf[100];
size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);
va_list args1;
va_list args2;
va_start(args1, fmt);
va_copy(args2, args1);
char buf[1+vsnprintf(NULL, 0, fmt, args1)];
va_end(args1);
vsnprintf(buf, sizeof buf, fmt, args2);
va_end(args2);
printf("%s [debug]: %s\n", time_buf, buf);
}
int main(void){
debug_log("Logging, %d, %d, %d", 1, 2, 3);
}
/*
输出结果:01/13/20 06:34:05.574187 UTC [debug]: Logging, 1, 2, 3
*/