一、__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的用法相关推荐

  1. python *args用法_python函数参数*args**kwargs用法实例

    #coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...

  2. Java基础 main 参数String[] args的用法

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  3. request.args.get()用法

    name_i = request.args.get('name') 当需要获取前端页面表单传过来的id值的时候,我们就需要用request.args.get,而不能用request.form

  4. java args的用法_Java中args参数数组的用法说明

    main方法args参数用于接收用户输入的参数,参数以字符串形式存放在数组中. 这里将传递参数参数的形式分两种,一种是传递普通参数,另一种是传递含有空格的参数. 1.传递普通参数 public cla ...

  5. python中*args **kwargs用法

    https://www.cnblogs.com/xujiu/p/8352635.html

  6. python * args和** kwargs的用法

    所属网站分类: python基础 > 函数 作者:慧雅 链接: http://www.pythonheidong.com/blog/article/18/ 来源:python黑洞网 www.py ...

  7. Python中 *args,**args的详细用法

    *args 和 **kwargs主要用于函数定义,你可以将不定数量的参数传递给某个函数. *args *args 不定参数(不定的意思是指,预先并不知道,函数使用者会传递多少个参数给你) *args是 ...

  8. python中*args和**kwargs参数的用法

    在Python中的代码中,经常会见到args 和 kwargs两个词,前面通常还会加上一个或者两个星号.其实,这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数:kw ...

  9. *args 和 **kwargs的用法

    *args 的用法 *args 和 **kwargs 主要用于函数定义. 你可以将不定数量的参数传递给一个函数. 这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下 ...

最新文章

  1. linux分区详解!
  2. linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客
  3. Linux视频 pad,Wine 1.9.10 发布下载, 改善视频输出
  4. ScalavsKotlin
  5. cocos2d-x 是男人就下100层 附源码
  6. Jmeter(二十三)稳定性测试后的波形图
  7. python套用word模板_套用word模板
  8. hmcl启动器安装游戏版本失败_HMCL 启动器教程 #2 安装游戏版本、模组加载器与高清修复...
  9. 2022年信息安全工程师考试知识点:网络安全需求分析与基本设计
  10. 天刀显示服务器失败,天涯明月刀手游提示安装失败怎么办 10月16日开服常见问题FAQ...
  11. JPA实现领域驱动设计(DDD) 中值对象的持久化
  12. java中强制退出jvm的代码
  13. 中国软件:10个人 , 20年坎坷路!
  14. 人体微生物组和幼儿成长---前1000天及以后
  15. 解析rtf格式的文件数据
  16. 反编译pbd文件中的dw,利用pb本身的功能
  17. 基于Office Project 2010 管理软件研发项目新体验
  18. 假设:  S1 = 1  S2 = 12  S3 = 123  S4 = 1234  .........  S9 = 123456789  S10 = 1234567891  S11 = 123456
  19. 超详细的A-level课程介绍
  20. PDF下载!南京大学的Python数据分析课件

热门文章

  1. mysql中写一个循环语句_mysql 如何写循环语句
  2. vue ElementUI引入第三方icon
  3. 全国C++职位需求统计20170507
  4. adb调试app中java环境变量配置(详细版)
  5. 高等教育学:教育研究与科学研究(完)
  6. 12月云短信报告出炉,阿里云闯进前三
  7. 关于JVM调优的工具及JVM 常见调优参数
  8. 使用2.4寸OLED显示器遇到的小问题
  9. java高级面试题整理
  10. Linux自动化--Jenkins构建之 1.Pipline详解