__VA_ARGS__ 是一个可变参数的宏(gcc支持)。实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。加##用来支持0个可变参数的情况。

测试代码:

#include<stdio.h> #define PRINT_DBG(debug, ...)\
{\ if(debug) {\ fprintf(stderr, "%s %s [%d]: ", __FILE__, __FUNCTION__, __LINE__);\ fprintf(stderr, __VA_ARGS__);\ }\
}
#define MACRO(s, ...) printf(s, ##__VA_ARGS__) int main()
{ int i =100; PRINT_DBG(1,"hello\n"); PRINT_DBG(1,"world, %d\n",i); MACRO("hello, world\n"); //这里没有可变参数, 所以要用##__VA_ARGS__ MACRO("hello, %s\n", "fanrey"); return 0;
} 

编译:gcc -o vaargs vaargs.c

运行: ./vaargs

vaargs.c main [16]: hello 
vaargs.c main [17]: world, 100 
hello, world 
hello, fanrey

转载于:https://www.cnblogs.com/MrYuan/p/5976464.html

可变参数宏__VA_ARGS__和...相关推荐

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

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

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

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

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

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

  4. 【嵌入式】C语言高级编程-可变参数宏(12)

    00. 目录 文章目录 00. 目录 01. 可变参数宏概述 02. ##符号 03. 可变参宏另外一种写法 04. 内核中的可变参数宏 05. 附录 01. 可变参数宏概述 #include < ...

  5. c语言宏定义可变参数,C语言可变参数宏定义方法

    http://blog.csdn.net/skyflying2012/article/details/38436711 2014 在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 1 2 ...

  6. c语言宏不能传递参数,关于c ++:可变参数宏:不能通过’…’传递非平凡复制类型的对象...

    我正在尝试为日志记录机制编写宏. 我编写了一个可变参数宏,但它不适用于std::string. 该代码如下所示: #include #include #define LOG_NOTE(m, ...) ...

  7. 巧用可变参数宏、编译器内置宏和printf输出调试信息

    前言: 我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调 ...

  8. 【valist】c语言可变参数宏

    va_list 是C语言中解决变参问题的一组宏. 1.API介绍: 头文件: [cpp]  view plain copy print ? #include <stdarg.h> 下面是实 ...

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

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

  10. c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法

    回顾 在[ANSIC几种特殊的标准定义]中我们讲述了比较常用的几项: __FILE__:正在编译文件的路径及文件名 __LINE__:正在编译文件的行号 __DATE__:编译时刻的日期字符串 如&q ...

最新文章

  1. Web前端开发人员和设计师必读文章推荐【系列七】
  2. 【怎样写代码】小技巧 -- 关于方法中修饰形参的关键词
  3. 【MATLAB】三维图形绘制 ( 绘制网格 + 等高线 | meshc 函数 | 绘制平面 + 等高线 | surfc 函数 )
  4. Android重写菜单增加系统自带返回键
  5. python文件处理,python文件处理
  6. OpenGL springmass弹簧质量模拟器的实例
  7. 《编译原理》课程教学大纲
  8. 移动后端支持平台Parse将API由Ruby迁移到Go
  9. CentOS 6.9编译安装新版本内核
  10. 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  11. Android 应用开发---API Level对应Android版本一览表
  12. python排序算法实现_排序算法整理(Python实现)
  13. 【转】XP远程桌面连接2008提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证 ....
  14. JSONObject对象和JSONArray对象的使用
  15. javascript滚动条响应鼠标滑轮的实现上下滚动事件
  16. 使用foobar2000将cue文件分割wav、ape、flac无损音乐
  17. 京东官网(京东注册,京东登录,京东首页,京东购物车,京东详情页,京东列表页)
  18. 关于Microsoft Project默认开始时间错误问题
  19. 中文文案排版 - 中文排版教程
  20. MP3文件分析之ID3v2.3版本

热门文章

  1. Map Reduce学习
  2. Struts1.x系列教程(19):LookupDispatchAction类处理一个form多个submit
  3. cookie token 了解一下
  4. webApplicationContext 与servletContext
  5. [readable]轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
  6. (二)win7下用Intelij IDEA 远程调试spark standalone 集群
  7. 【个人笔记】Vue+ElementUI后台模板配置动态路由
  8. yyds!Java 性能优化的 50 个细节(珍藏版)
  9. 扒一扒微信后台架构.....
  10. “产品助理最重要的工作是 Android 版本的设计与测试”