##__VA_ARGS__与##args的用法
一、__VA_ARGS__简介
C 语言中 VA_ARGS 是一个可变参数的宏,是新的 C99 规范中新增的,需要配合 define 使用,总体来说就是将左边宏中 … 的内容原样抄写在右边 VA_ARGS 所在的位置;
举个例子:
#define myprintf(...) printf( __VA_ARGS__)
#include <stdio.h>#define myprintf(...) printf( __VA_ARGS__)int main()
{myprintf("123123456\n");return 0;
}book@ubuntu:~/temp$ gcc -o hello_arg hello_arg.c
book@ubuntu:~/temp$ ./hello_arg
123123456
book@ubuntu:~/temp$
二、__VA_ARGS__宏输出可变参数
#include <stdio.h>#define myprintf(fm, ...) printf(fm,__VA_ARGS__) int main()
{//输出可变参数myprintf("0123456789,%d%s\r\n",1,"sd"); //OK//myprintf("987654321"); //输出字符串常量报错return 0;
}
book@ubuntu:~/temp$ gcc -o hello_arg hello_arg.c
book@ubuntu:~/temp$ ./hello_arg
0123456789,1sd
从这里可以看到这种写法只支持可变参数,不支持字符串常量。
三、##VA_ARGS
##__VA_ARGS__使用如下:
#define myprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
如果可变参数被忽略或为空,## 操作将使预处理器(preprocessor)去除掉它前面的那个逗号.
如果你在宏调用时,确实提供了一些可变参数,GNU CPP 也会工作正常,它会把这些可变参数放到逗号的后面。
##__VA_ARGS__使用
#include <stdio.h>#define myprintf(fm, ...) printf(fm,##__VA_ARGS__) int main()
{//输出可变参数myprintf("0123456789,%d%s\r\n",1,"sd"); //OKmyprintf("987654321\r\n"); //输出字符串常量正常return 0;
}
book@ubuntu:~/temp$ gcc -o hello_arg hello_arg.c
book@ubuntu:~/temp$ ./hello_arg
0123456789,1sd
987654321
同样的例子从上面的代码可以看出,使用 ##VA_ARGS 完美兼容可变参数和字符串常量输出;
四、gcc 复杂宏##args用法
#define debug(format, args…) printf(format, ##args)
#的作用 : 连接两个宏,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号,编译不会报错.
本文中涉及的##__VA_ARGS__与##args在代码中常见的写法:
#define print_LOG(level, fmt, ...) printf("[%s][%d]"fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)#define print_LOG(level, fmt, args...) SYS_LOG("[WIFI]", level, fmt, ##args)
##__VA_ARGS__与##args的用法相关推荐
- python *args用法_python函数参数*args**kwargs用法实例
#coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...
- Java基础 main 参数String[] args的用法
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- request.args.get()用法
name_i = request.args.get('name') 当需要获取前端页面表单传过来的id值的时候,我们就需要用request.args.get,而不能用request.form
- java args的用法_Java中args参数数组的用法说明
main方法args参数用于接收用户输入的参数,参数以字符串形式存放在数组中. 这里将传递参数参数的形式分两种,一种是传递普通参数,另一种是传递含有空格的参数. 1.传递普通参数 public cla ...
- python中*args **kwargs用法
https://www.cnblogs.com/xujiu/p/8352635.html
- python * args和** kwargs的用法
所属网站分类: python基础 > 函数 作者:慧雅 链接: http://www.pythonheidong.com/blog/article/18/ 来源:python黑洞网 www.py ...
- Python中 *args,**args的详细用法
*args 和 **kwargs主要用于函数定义,你可以将不定数量的参数传递给某个函数. *args *args 不定参数(不定的意思是指,预先并不知道,函数使用者会传递多少个参数给你) *args是 ...
- python中*args和**kwargs参数的用法
在Python中的代码中,经常会见到args 和 kwargs两个词,前面通常还会加上一个或者两个星号.其实,这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数:kw ...
- *args 和 **kwargs的用法
*args 的用法 *args 和 **kwargs 主要用于函数定义. 你可以将不定数量的参数传递给一个函数. 这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下 ...
最新文章
- linux分区详解!
- linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客
- Linux视频 pad,Wine 1.9.10 发布下载, 改善视频输出
- ScalavsKotlin
- cocos2d-x 是男人就下100层 附源码
- Jmeter(二十三)稳定性测试后的波形图
- python套用word模板_套用word模板
- hmcl启动器安装游戏版本失败_HMCL 启动器教程 #2 安装游戏版本、模组加载器与高清修复...
- 2022年信息安全工程师考试知识点:网络安全需求分析与基本设计
- 天刀显示服务器失败,天涯明月刀手游提示安装失败怎么办 10月16日开服常见问题FAQ...
- JPA实现领域驱动设计(DDD) 中值对象的持久化
- java中强制退出jvm的代码
- 中国软件:10个人 , 20年坎坷路!
- 人体微生物组和幼儿成长---前1000天及以后
- 解析rtf格式的文件数据
- 反编译pbd文件中的dw,利用pb本身的功能
- 基于Office Project 2010 管理软件研发项目新体验
- 假设: S1 = 1 S2 = 12 S3 = 123 S4 = 1234 ......... S9 = 123456789 S10 = 1234567891 S11 = 123456
- 超详细的A-level课程介绍
- PDF下载!南京大学的Python数据分析课件