[翻译] Macros with a Variable Number of Arguments - GCC
可变参数宏(Variadic Macro)
在1999年的ISO C标准中,可以声明一个像函数一样接受可变参数的宏。定义这种宏的语法与函数的定义相似。这是一个例子:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
其中,‘…’ 是可变参数。在宏的声明中,它代表0个或更多个tokens和任意数量的逗号,直到遇到闭合括号来结束声明。这些tokens的集合替代出现在宏体中任意位置的标识符__VA_ARGS__。可查看CPP手册以得到更多信息。
GCC一直以来支持可变参数宏,并且使用不同的语法来允许为这些可变参数定义一个名字,就像任何其他参数一样。这里有一例子:
#define debug(format, args...) fprintf (stderr, format, args)
这个例子在各个方面都与上面的ISO C例子等价,但更具可读性和描述性。
GNU CPP提供两种进一步的可变宏扩展,以允许使用上面的任意一种宏定义形式。
在标准C中,完全忽略变量参数是不被允许的;但传递空参数是允许的。例如,这个声明在ISO C中是无效的,因为字符串后没有逗号。
debug ("A message")
GNU CPP允许你以这种方式完全忽略变量参数。在上面的例子中,编译器会报错,是因为在格式字符串外,宏扩展仍然有额外的逗号。
为了有助于解决这个问题,CPP 针对变量参数的行为表现,使用了‘##’操作符(token paste operator)。如果你写成如下形式:
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
当可变参数为空或被忽略时,‘##’操作符使预处理器去除在它之前的逗号。如果你在宏声明里确实提供了一些可变参数,GNU CPP不会对这种paste operation报错,而是直接将这些可变参数放在逗号后面。就像任意其他连接的宏参数,这些参数没有进行宏扩展。
英文原文:https://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
[翻译] Macros with a Variable Number of Arguments - GCC的更多相关文章
- Variable number of arguments (Varargs)
A parameter of a function (normally the last one) may be marked with vararg modifier: fun <T> ...
- Lua 变长参数(variable number of arguments)
lua变长参数 function add ( ... ) for i, v in ipairs{...} do print(i, ' ', v) end end add(1, 2, 'sdf') lu ...
- How to create functions that can accept variable number of parameters such as Format
http://www.chami.com/tips/delphi/112696D.html Sometimes it's necessary to pass undefined number of [ ...
- wrong number of arguments,java方法反射时数组参数的坑
java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数. 两个数组不是一个意思啊. 我们应该把数组转为objet,这样才表示一个参数. import j ...
- Error Code: 1318. Incorrect number of arguments for PROCEDURE company.new_procedure; expected 2, got
1.错误叙述性说明 20:27:34 call new_procedure(20150112) Error Code: 1318. Incorrect number of arguments for ...
- Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got
1.错误描述 13:58:20 call new_procedure('2000','zhangsan') Error Code: 1318. Incorrect number of argument ...
- [Jedis] ERR wrong number of arguments for 'mget'
看别人写的代码是件比较痛苦的事情,更加痛苦的是别人的代码出错还要负责调试好. 关于如何迅速定位问题和调试代码,我的一点感受是:逐行认真查看错误信息,在这些信息中找自己熟悉的内容(包括文件名.方法名等) ...
- hbase ERROR: wrong number of arguments (3 for 4)
hbase(main):036:0> get 'ddl', 'example', 'info:age'COLUMN ...
- 反射报错java.lang.IllegalArgumentException: wrong number of arguments
class Person{ private String name ; private String sex ; public Person(){ System.out.println("c ...
随机推荐
- centos 7 设置开机启动服务
2018-12-25 Centos7下添加开机自启动脚本和服务的方法 以docker 服务为例 1.centos7自带命令设置 systemctl enable docker.service 2.设置 ...
- 初学 spring
1.spring 开发环境,包含eclipse https://spring.io/tools3/sts/all/
- kafka的安装及基本使用
1.安装zookeeper # 解压缩 [root@localhost zookeeper]# .tar.gz [root@localhost zookeeper]# zk_simple # 复制zo ...
- [转]矩阵树$Matrix-Tree$定理与行列式
[https://www.cnblogs.com/zj75211/p/8039443.html][矩阵树Matrix-Tree定理与行列式]
- ffmpeg intro - pull and push
ffmpeg -i rtmp://rtmp.test.com/live/livestream -c:v copy -c:a copy -f flv rtmp://172.31.11.53/myhls/ ...
- (转)expect命令脚本语言介绍及生产实践
原文:http://www.fblinux.com/?p=526 Expect介绍 expect是一个用来实现自动交互功能的软件套件,是用来实现自动和交互式任务程序进行通信,无需人的手工干预.比如SS ...
- Web测试注意事项
参考文章:http://www.51testing.com/html/07/n-3723307.html 总结下遇到的web测试的时候需要注意的地方: 页面分辨率: 通常是计算机的默认分辨率,但是还 ...
- 1.4 js基础
1.eval(字符串),将字符串变成可执行的语句. 太强大了,太危险了 .目前不要去使用. 注入攻击 2.作用域[起作用的范围] 全局变量:声明在函数外 ...
- weblogic JDBC Connection Pools--转官方文档
http://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/jdbc_connection_pools.html#1106016 JDBC C ...
- 二叉树数组C++实现
基本概念梳理 孩子:子结点 双亲:父节点 度:有多少个子结点 有序树:固定的排列的树 无序树:排列与顺序无关的树 二叉树:所有结点小于等于2的树 源代码:https://github.com/cjy5 ...