可变参数__VA_ARGS__使用和va_list使用小结

1. #用来把参数转换成字符串

#define P(A) printf("%s:%d\n",#A,A);

#define SQUARE(x) printf("The square of "#x" is %d.\n", ((x)*(x)));

 

2. ##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号

 

3. __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。

实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。

 

4. ##__VA_ARGS__ 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错

 

举例:

#define my_print1(...)  printf(__VA_ARGS__)

#define my_print2(fmt,...)  printf(fmt,__VA_ARGS__)  

#define my_print3(fmt,...)  printf(fmt,##__VA_ARGS__)  

 

5. 

C语言printf家族函数的成员:

#include stdio.h

int printf(const char *format, ...); //输出到标准输出

int fprintf(FILE *stream, const char *format, ...); //输出到文件

int sprintf(char *str, const char *format, ...); //输出到字符串str中

int snprintf(char *str, size_t size, const char *format, ...);

                                     //按size大小输出到字符串str中

  

以下函数功能与上面的一一对应相同,只是在函数调用时,把上面的...对应的一个个变量用va_list调用所替代。在函数调用前ap要通过va_start()宏来动态获取。

#include stdarg

int vprintf(const char *format, va_list ap);

int vfprintf(FILE *stream, const char *format, va_list ap);     

int vsprintf(char *str, const char *format, va_list ap);

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

 

 

// 函数add() 计算可选参数之和

// 参数:第一个强制参数指定了可选参数的数量,可选参数为double类型

double add( int n, ... )

{

int i = 0;

double sum = 0.0;

va_list argptr;

va_start( argptr, n ); // 初始化argptr

for ( i = 0; i < n; ++i )        // 对每个可选参数,读取类型为double的参数,

sum += va_arg( argptr, double ); // 然后累加到sum中

va_end( argptr );

return sum;

}

 

//里有vsnprintf整合可变参数为字符串

void stdio_printf(const char* fmt, ...)

{

    uint16_t len, i;

    va_list ap;

    char buffer[256];

    

    va_start(ap, fmt);

    len = vsnprintf(buffer, sizeof(buffer), (const char*)fmt, ap);

    va_end(ap);

uart_send(buffer, len);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值