刚刚在进行STM32开发时看到几行非常让人不理解的代码,然后我去查了一下,发现非常有趣,在这分享给大家一起学习。
代码如图1所示,其中标记编号的三行就是问题代码。如果你也不理解,那么接下来就让我来详细的给大家介绍一下。
这三条语句中1、3其实是C标准库里面的宏函数,2是C库函数,它们的标准化格式如下所示:
1、void va_start(va_list ap, last_arg)
作用是初始化 ap 变量,它要 va_arg 和 va_end 宏共同使用。last_arg 是最后一个传递给函数的已知的固定参数,就是图中第44行省略号之前的参数“fmt”。
这个宏必须在使用 va_arg 和 va_end 之前被调用。
2、int vsprintf(char *str, const char *format, va_list arg)
使用参数列表发送格式化输出到字符串
3、void va_end(va_list ap)
允许使用了 va_start 宏的带有可变参数的函数返回。如果我们在返回之前在函数里没有调用 va_end,那么就会出现未定义的结果。
是不是已经蒙了???没关系,上面的都不重要,给你个例子立马明白。
#include
#include
char buf[80];
int func_print(char *format, ...)
{
va_list aptr;
int ret;
va_start(aptr, format);
ret = vsprintf(buf, format, aptr);
va_end(aptr);
return(ret);
}
int main()
{
int i = 5;
float f = 27.0;
char s[50] = "haha";
func_print("%d %f %s", i, f, s);
printf("%s
", buf);
return(0);
}
找个在线C编译器试一下,结果如图2
输出结果为:5 27.000000 haha
页面更新:2024-04-13
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号