引入:最近在移植MPU6050的DMP库的时候遇到了许多问题,其驱动代码中有关打印日志的部分让我印象深刻,他的传参格式和printf很像,包括在做其他驱动移植参考别人的移植代码时,别人的串口输出函数也是用的printf关键字。这种传参方式在参数格式多变,数量多变的情况下着实有用。
这里我们先来了解一下传统printf函数的代码。。
int printf(const char *format, ...)
{
va_list L; //生成栈
int count=0; //用于记录参数个数
va_start(L,format);//指向栈中的第一个数据 (获取首指针)
count=vprintf(format,L);//轮询打印
va_end(L); //结束栈(清除)
return count;
}
从这段代码中可以知道:
- 不定参函数的定义格式 : 类型 函数名(参数,...){代码段;}
- 代码段是一堆用于处理参数的宏定义和一个返回值(这里用于返回参数个数)组成。
对于不定参函数最重要的宏命令有这三个:va_list , va_start , va_end 。
va_list | 定义一个用于存放不定参数的列表。 |