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

}

可变参数__VA_ARGS__使用和va_list使用小结相关推荐

  1. python args_Python可变参数*args和**kwargs用法实例小结

    本文实例讲述了Python可变参数*args和**kwargs用法.分享给大家供大家参考,具体如下: 一句话简单概括:当函数的参数不确定的时候就需要用到*args和**kwargs,前者和后者的区别在 ...

  2. 参数控制c语言代码走向,C语言可变参数完全解读

    本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...

  3. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统

    在嵌入式应用的开发过程中,日志系统是非常重要的! 特别是在生产环节出现了偶发性的.与当前的执行环境相关的bug的时候, 如果没有日志系统来追踪问题,很难进行问题重现. 因此,实现一个自己的日志系统是很 ...

  4. printf 函数使用 可变参数函数实现原理

    一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...

  5. #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号

    [Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...

  6. 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法

     参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...

  7. 怎样安全的使用可变参数宏__VA_ARGS__

    今天遇到一个关于可变参数的问题,下面先给出一个示例程序说明我遇到的问题. 0 #include <stdio.h> 1 2 #define print(fmt, ...) out(fmt, ...

  8. 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)

    本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...

  9. ## __VA_ARGS__ ... 宏和可变参数

    在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变 ...

最新文章

  1. 018_html文件路径
  2. shell学习笔记3---awk的执行过程(原创)
  3. 子菜单挤压下方块元素_小心上瘾!全新类型的消除游戏|《土耳其方块》
  4. 信息学奥赛一本通(1138:将字符串中的小写字母转换成大写字母)
  5. MySQL还是h5储存数据_h5中五大存储方式
  6. visual studio 2017搭建linux c++开发环境
  7. myfiles_WINDOWSXP-KB936929-SP3-X86-CHS.zip
  8. 51单片机(八)—— 数码管电路介绍
  9. c# 剔除sql语句‘尾巴‘的五种方法
  10. CDlinux万能无线破解系统iSO中文版 U盘启动版
  11. 27个最佳免费WordPress主题(2022年精选)
  12. 大数据对人们生活的积极影响_大数据对生活带来的影响
  13. 宁芝普拉姆键盘说明书以及键盘校验软件
  14. 折腾词库,一个词库互转程序
  15. 国家为什么会失败-读书笔记
  16. 一文读懂md5,md5有什么用,什么是md5加盐
  17. Ctfhub解题 web RCE
  18. MATLAB中eye()函数的用法
  19. 分享几个 Windows 实用技巧
  20. Java常量池理解与总结(讲的非常浅显易懂)

热门文章

  1. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
  2. TensorFlow全新的数据读取方式:Dataset API入门教程
  3. springboot 定制个性 banner
  4. vue的post请求data可以传两个参吗_我知道的HTTP请求
  5. html基础--列表标签03,03HTML基础--列表标签
  6. 冷板式液冷--术语、定义和缩略语(6-1)
  7. 「名词」数据管理、数据治理、数据中心、数据中台、数据湖、数据资产等
  8. 上海临港新片区:新建数据中心CPUE值≤1.25 正建国际互联网数据专用通道
  9. 火神山医院紧急招募IT运维志愿者需求
  10. PDU是如何帮助机房安然度夏?如何选择PDU电源配套机柜?