[翻译] 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 ...
随机推荐
- mac 上安装vue模版-D2 Admin
1.首先下拉模版,打开mac自带“终端” 2.安装项目 3.出现的错误 4.启动项目
- Locust 基本使用
Locust 使用Python代码来定义用户行为,用它可以模拟百万级的并发用户来访问系统. 与其他性能工具对比如下: LoadRunner 商业性能测试工具,报告完整,不支持二次开发 开发语言:C/J ...
- dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法 http://www.mamicode.com/info-detail-1439628.html
- 推荐-Everything搜索工具
简介: windows操作系统下极其强大的文件搜索工具. 下载: https://www.voidtools.com/downloads/ 推荐理由: 速度之快难以想象,日常工作必备工具之一. 发现的 ...
- 对接京东jos遇到的坑 记录一下。方便查询
坑很多,有一些忘记了.文档乱的很,有问题可以私信我一下我看能不能想起来. 坑一.添加商品接口. {"error_response": {"code":" ...
- OpenStack Neutron配置虚拟机访问外网
配置完成后的网络拓扑如下: 当前环境: X86服务器1台 Ubuntu 16.04 DevStack搭建OpenStack 网络拓扑: 外部网络:192.168.98.0/24 内部网络:10.0.0 ...
- 给你的移动网站加点料:推荐下载App,如果本地安装则直接打开本地App(Android/IOS)
纵观现在每家移动网站,打开首页的时候,都有各种各样的形式来提示你下载自身的移动App(Android/IOS),这是做移动客户端产品的一个很好地引流的手段.当然各家引流下载的交互和视觉各不相同,有的是 ...
- 《Crafting Rails 4 Applications》的笔记-第28页
进行邮件测试,你需要在dummy目录下的虚拟程序添加一个配置 In your config/enviroments/test.rb, by default you should have the li ...
- HTTP 状态代码之汇总+理解
这里有百度百科的介绍,还挺全的. 下面是在开发过程中遇到过的各种码,自己的问题自己的原因,同码不同错,贱笑贱笑. HTTP 406 Not Acceptable 这个错误的原因,是由于框架使用了`Sp ...
- spring异常被吞的一种情形
你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...