目录
用标准库完成不定长参数输出
void u3_printf(char* fmt,...) 之中有部分如下
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
ap:一个char指针
fmt:不定长参数的最后一个,也是参数的第一个
USART3_TX_BUF:缓存数组地址;
整体解析:
形参后面3点代表不定长参数,其中第一个fmt是最后一个传入的,堆栈原则,右边先入;
调用函数指定用到va_list类型的指针;
va_start
va_end配套使用
va_start 函数
对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身指向fmt,第二个参数是在变参表前面紧挨着的一个变量,即“…”之前的那个参数;
va_arg(参1,参2) 函数
它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
va_end 函数
输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。
vsprintf函数
原型 int vsprintf (char * s, const char * format, va_list arg );
vsprintf((char*)USART3_TX_BUF,fmt,ap);
USART3_TX_BUF缓存;fmt 参数表第一个参;ap 当前位置;
描述:
将可变参数列表的格式化数据写入字符串
使用由arg标识的变量参数列表中的元素而不是附加函数参数,并将结果内容作为C字符串存储在s指向的缓冲区中。
在内部,函数从arg标识的列表中检索参数,就好像va_arg被使用了一样,因此arg的状态很可能被调用所改变。
sprintf函数
介绍类似的vsprintf()的函数
原型
extern _ARMABI int sprintf(char * __restrict /*s*/, const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1,2)));
/*
* is equivalent to fprintf, except that the argument s specifies an array
* into which the generated output is to be written, rather than to a
* stream. A null character is written at the end of the characters written;
* it is not counted as part of the returned sum.
* Returns: the number of characters written to the array, not counting the
* terminating null character.
*/
详解:__restrict为一个数组的指针,常指针,...三个点,不定长参数;
把常指针的字符串,并且把参数放进字符串中,然后储存在数组里面;
返回值是写入到数组中的个数;
参考链接: