[翻译] 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 ...
随机推荐
- vue,新手上路,基础,常见问题
1. 报这个错的 都是关键字问题,不要用关键字 做为组件的名字,不然肯定都会报错,如果找不到就一个字母的看,我就是 忘记改组件的名字导致报错,这个问题 改个名字就好,切记改全不然只有页面报错,文 ...
- WIndows下 Pycharm 配置Anaconda和TensorFlow
1安装PyCharm 前提安装Python,然后去官网下载PyCharm 2 安装Anaconda 在官网下载Anaconda,并安装 下载好之后就跟安装一般的软件没啥区别,选择自己安装的文件夹,下一 ...
- (转)bash条件判断之if语句
http://blog.51cto.com/64314491/1629175---------bash条件判断之if语句(一) http://blog.51cto.com/64314491/16292 ...
- php 内存共享shmop源码阅读
多进程通信的时候,会涉及到共享内存.shmop_open()创建或打开一个内存块 PHP_FUNCTION(shmop_open) { long key, mode, size; struct php ...
- MySql的备份还原
备份数据是数据库管理最常用的操作.为了保证数据库中数据的安全,数据管理员需要定期进行数据备份.一旦数据库遭到破坏,便可通过备份的文件来还原数据库.因此,数据备份是一项很重要的工作. 数据备份 使用my ...
- 入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由苏子晨 发表于云+社区专栏 介绍 随着您的应用程序或网站的增长,您可能已经超出了当前的服务器设置.如果您在同一台计算机上托管Web服务 ...
- Maven的目录结构和常用命令
一.Maven项目的目录结构 1.顶级目录结构 src:该目录主要存放的是项目的源代码文件. target:该目录是项目编译后产生的一个目录,主要存放的是编译后的.class文件. pom.xm ...
- ExtJs6自定义scss解决actionColum中iconCls图标不能调样式的问题
问题:图标样式不对,icon(本地图片)是对的,iconCls(引用的)样式不对 查ExtJs6的API里面说,可以用style添加样式,然而并没有作用 最后在该文件树下建立scss,最好和view文 ...
- oracle 自动表分区
Oracle 新功能自动分区: 实现代码: create table t_interval partition by range(created)//dba_objects 视图的一个字段 inter ...
- File.Exists(Application.StartupPath + \\Settings\\Settings.xml)
File.Exists(Application.StartupPath + "\\Settings\\Settings.xml")