__VA_ARGS__宏是C99 引入的对参数个数可变的函数式宏的正式支持

#define name(args, ...) tokens
#define name(...) tokens

"…“代表可变参数列表, 如果它不是仅有的参数, 那么它只能出现在参数列表的最后. 调用这样的函数宏时, 传递给它的参数个数要不少于参数列表中参数的个数(多余的参数被丢弃).
通过__VA_ARGS__来替换函数宏中的可变参数列表. 注意__VA_ARGS__只能用于函数宏中参数中包含有”…"的情况.

#define my_print1(...)  printf(__VA_ARGS__)
int main()
{my_print1("i=%d,j=%d\n",i,j)  //正确打印
}
------------------------------------------------------------------------------
#define my_print1(fmt,...)  printf(fmt,__VA_ARGS__)
int main()
{my_print1("i=%d,j=%d\n",i,j);  //正确打印
my_print1("iiiiiii\n") ;    //编译失败打印,因为扩展出来只有一个参数,至少要两个及以上参数
}

如果是
#define my_print1(fmt,...) printf(fmt,##__VA_ARGS__)
那么my_print1里面不管是几个参数都能正确打印

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

关于__VA_ARGS__的说明相关推荐

  1. C语言便于调试的宏定义 __FILE__、__FUNCTION__、__LINE__、__VA_ARGS__ 参数使用

    __FILE__.__FUNCTION__.__LINE__ 这几个宏定义从名字就可以看出功能: __FILE__:宏在预编译时会替换成当前的源文件名,字符串类型. __FUNCTION__:宏在预编 ...

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

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

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

    1. #用来把参数转换成字符串 #define P(A) printf("%s:%d\n",#A,A); #define SQUARE(x) printf("The sq ...

  4. __VA_ARGS__宏

    #define LOG( format, ... ) Console::WriteLine( format, __VA_ARGS__ )

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

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

  6. C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程

    目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...

  7. C语言 ##__VA_ARGS__ - C语言零基础入门教程

    目录 一.##__VA_ARGS__原理 二.##__VA_ARGS__使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.##__ ...

  8. C语言 __VA_ARGS__ - C语言零基础入门教程

    目录 一.__VA_ARGS__简介 二.__VA_ARGS__使用 1.__VA_ARGS__宏输出字符串常量 2.__VA_ARGS__宏输出可变参数 三.__VA_ARGS__缺点 1.仅仅只支 ...

  9. linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用

    在阅读代码的时候,在一个宏定义语句中,发现了个之前未曾见过的编译器预定义宏:"__VA_ARGS__".当时,从代码语句中推测它代表宏参数:"-"(本文称之为省 ...

最新文章

  1. c 使用腾讯云mysql_腾讯云使用笔记一: 环境搭建
  2. 8 分钟了解 Kubernetes
  3. python 源码保护_Python代码保护
  4. 数据中心SDN技术发展应用之MP-BGP
  5. 传统ELK分布式日志收集的缺点?
  6. spark中dataframe解析_SparkSql 中 JOIN的实现
  7. 多序列比对软件Jalview的安装及使用体验
  8. 为什么阿里巴巴不建议MySQL使用Text类型?
  9. Java SE 007 循环控制语句
  10. php 加权计算公式,PHP计算加权平均数的方法
  11. Conflux的自我进化:从DAG到树图| 对话伍鸣
  12. (三)对图像进行Gauss高斯平滑处理
  13. 什么是番茄工作法?如何使用番茄工作法?
  14. Linux 知:文件系统
  15. Python004~005
  16. 谷歌浏览器批量下载数据,以批量下载modis数据为例
  17. 固定资产的主要包括哪些
  18. CSS餐厅练习链接及参考答案
  19. matlab中unidpdf,matlab poisspdf
  20. VMware ESXi导入苹果虚拟机

热门文章

  1. SQL 必知必会·笔记9使用子查询
  2. IE 11 预览版初体验
  3. Boghe连接FreeSwitch的配置
  4. Comperhend the OP-sizeof deeply!
  5. 使用自己的按钮关闭或刷新RadWindow
  6. PXE网络装机之centos7(批量自动装机)
  7. LeetCode每日一题: 单值二叉树(No.965)
  8. 安卓Android科大讯飞语音识别代码使用详解
  9. IIS7、IIS8添加net.tcp协议报错 未将对象引用设置到对象的实例。
  10. HP-Unix安装Memcache问题