首页 > 其他分享 >C 可变参数宏

C 可变参数宏

时间:2022-12-03 16:01:10浏览次数:34  
标签:__ ... format ## 参数 可变

经常看到源码的宏定义,一直不清楚 ## , _VA_ARGS , ... , args... 的作用是什么,记录下。

1999 年的 ISO C 标准里规定了可变参数宏,语法和函数类似,比如:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
其中的“...”表示可变参数,实际调用时,它们会替代宏体里的__VA_ARGS__。GCC 支持更复杂的形式,可以给可变参数取个名字,如下所示。

#define debug(format, args...) fprintf (stderr, format, args)

有了名字之后,代码显得更具有可读性。内核中的例子为:

++++ include/linux/kernel.h

244  #define pr_info(fmt,arg...) \
245  printk(KERN_INFO fmt,##arg)

其中的 pr_info 和上面的 debug 形式除了“##”外,几近相同。

“##”主要针对参数为空的情况。既然称为可变参数,那传递空参数也是可以的。如果没有使用“##”,传递空参数时,比如:
debug ("A message");
宏展开后,其中的字符串后面会多个多余的逗号,而“##”则会使预处理器去掉这个多余的逗号。

标签:__,...,format,##,参数,可变
From: https://www.cnblogs.com/aalan/p/16948198.html

相关文章

  • C#命令行参数解析库System.CommandLine介绍
    命令行参数平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只......
  • 查看前端页面调用接口及参数方法
    查看前端页面调用接口及参数方法依该页面的查询按钮为例(浏览器为Goole)  第一步:摁一下键盘上的F12①会看到调试信息框出现在了右边,由于屏幕的原因,让这个信息框在右边......
  • Python笔记-脚本参数传递
    编写Python脚本,经常需要从外部传递参数,此时需要用到getopt和sys。语法如下:getopt.getopt(args,shortopts,longopts=[])args参数列表shortopts短参数,如:-hlongopt......
  • Python笔记-从配置读取参数
    实用的脚步通常需要一些动态参数,如果参数太多,从命令行传递就太麻烦了。从配置文件读取,是比较实用的方法。以下示例为从test.cfg中读取参数,配置文件为json格式。配置文件......
  • 强制解决Java参数乱码问题
    在我们日常开发中,常常复制的url路径都是这样的原路径:https://xxxx.oss-cn-hangzhou.xxxxxx.com/2022/xx/文件名.pdf复制出来的路径:https://xxxx.oss-cn-hangzhou.xxxxxx.com......
  • 参数化
    方法一:使用“函数助手”添加从文件中读取字符串的函数。通过菜单“选项”-“函数助手对话框”调出“函数助手”。选择“__StringFromFile”  填写文件路径;可以填入......
  • 使用关联参数
    在http请求下加入“后置处理器”->“正则表达式提取器”:引用名称即使用的参数名;填入正则表达式;模板选取匹配的组;匹配数字为匹配的个数,负数表示全部匹配;缺省值为没有匹配到......
  • arthas 生成运行时的方法请求与响应参数
      请求格式watch类方法'{params,returnObj,throwExp}'-n5-x3其中参数说明:params是参数列表,是一个数组,可以直接通过下标方式访问returnObj返回的结果t......
  • C++ 设计一个类模板,有数据成员T data[size],有求最大值的方法getMax()和排序的方法sort
    #include<iostream>#include<string>usingnamespacestd;template<typenameT,intsize>classData{Tdata[size];public:Data(){cout<<......
  • params 可变参数
    作用:将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。 usingSystem;namespaceparams参数{classProgram{staticvoidMain......