C语言 - 可变长参数列表

参考
C 可变参数 | 菜鸟教程

void func(const char* str,...)
{
    ...
}

func 的最后一个参数写成 ... ,表示可变参数, C 语言的 printf 就是类似这种声明.

为了使用可变参数,需要包含头文件 stdarg.h.

使用步骤

  • 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
  • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表,va_start 需要传递两个参数,一个是 va_list 变量,另一个使用可变参数的函数中的可变参数之前的一个参数,比如要在 func 中,应该这样写,va_list args; va_start(args,str);。宏 va_start 是在 stdarg.h 头文件中定义的。
  • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
  • 使用宏 va_end 来清理赋予 va_list 变量的内存。

实例

Stm32F4 中实现类似 printf 输出的 LCD 显示函数.
需要头文件:
stdarg.h (va_list va_start va_end)
stdio.h (vsprintf malloc)
string.h (strlen)

注意需要即时释放内存!!!

void LCD_ShowStringx(uint16_t x,uint16_t y,uint16_t color,const char*str,...)
{
	uint16_t str_len = strlen(str);
	char* strFormatted = malloc(str_len*sizeof(char));
	va_list args;	//存放可变参数的数据结构
	va_start(args,str); //初始化可变参数,需要传一个va_list类型变量,和可变参数之前的参数,这里是str

	vsprintf(strFormatted,str,args);
	LCD_ShowString(x,y,(u8*)strFormatted,color); //此函数再头文件 stdio中

	free(strFormatted);
	va_end(args);
}

调用

float value = 0;
LCD_ShowStringx(30,50,POINT_COLOR,"value=%.2f",value);
posted @ 2019-07-27 10:22  Laggage  阅读(913)  评论(0编辑  收藏  举报