可变参数__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);
}
可变参数__VA_ARGS__使用和va_list使用小结相关推荐
- python args_Python可变参数*args和**kwargs用法实例小结
本文实例讲述了Python可变参数*args和**kwargs用法.分享给大家供大家参考,具体如下: 一句话简单概括:当函数的参数不确定的时候就需要用到*args和**kwargs,前者和后者的区别在 ...
- 参数控制c语言代码走向,C语言可变参数完全解读
本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...
- c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统
在嵌入式应用的开发过程中,日志系统是非常重要的! 特别是在生产环节出现了偶发性的.与当前的执行环境相关的bug的时候, 如果没有日志系统来追踪问题,很难进行问题重现. 因此,实现一个自己的日志系统是很 ...
- printf 函数使用 可变参数函数实现原理
一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...
- #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号
[Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...
- 怎样安全的使用可变参数宏__VA_ARGS__
今天遇到一个关于可变参数的问题,下面先给出一个示例程序说明我遇到的问题. 0 #include <stdio.h> 1 2 #define print(fmt, ...) out(fmt, ...
- 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)
本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...
- ## __VA_ARGS__ ... 宏和可变参数
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变 ...
最新文章
- 018_html文件路径
- shell学习笔记3---awk的执行过程(原创)
- 子菜单挤压下方块元素_小心上瘾!全新类型的消除游戏|《土耳其方块》
- 信息学奥赛一本通(1138:将字符串中的小写字母转换成大写字母)
- MySQL还是h5储存数据_h5中五大存储方式
- visual studio 2017搭建linux c++开发环境
- myfiles_WINDOWSXP-KB936929-SP3-X86-CHS.zip
- 51单片机(八)—— 数码管电路介绍
- c# 剔除sql语句‘尾巴‘的五种方法
- CDlinux万能无线破解系统iSO中文版 U盘启动版
- 27个最佳免费WordPress主题(2022年精选)
- 大数据对人们生活的积极影响_大数据对生活带来的影响
- 宁芝普拉姆键盘说明书以及键盘校验软件
- 折腾词库,一个词库互转程序
- 国家为什么会失败-读书笔记
- 一文读懂md5,md5有什么用,什么是md5加盐
- Ctfhub解题 web RCE
- MATLAB中eye()函数的用法
- 分享几个 Windows 实用技巧
- Java常量池理解与总结(讲的非常浅显易懂)
热门文章
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
- TensorFlow全新的数据读取方式:Dataset API入门教程
- springboot 定制个性 banner
- vue的post请求data可以传两个参吗_我知道的HTTP请求
- html基础--列表标签03,03HTML基础--列表标签
- 冷板式液冷--术语、定义和缩略语(6-1)
- 「名词」数据管理、数据治理、数据中心、数据中台、数据湖、数据资产等
- 上海临港新片区:新建数据中心CPUE值≤1.25 正建国际互联网数据专用通道
- 火神山医院紧急招募IT运维志愿者需求
- PDU是如何帮助机房安然度夏?如何选择PDU电源配套机柜?