C语言 - 可变参数再stm32中的应用

参考
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);

你可能感兴趣的:(C语言 - 可变参数再stm32中的应用)