zoukankan      html  css  js  c++  java
  • [翻译] Macros with a Variable Number of Arguments

    可变参数宏(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

  • 相关阅读:
    git 备忘录
    模拟HTTP协议接收请求并返回信息
    微信公众号支付回调页面处理asp.net
    WinForm下判断文件和文件夹是否存在
    C# 如何判断ie版本号和获取注册表中的信息
    【转】GDI+中发生一般性错误的解决办法
    c# winform 获取当前程序运行根目录
    模拟按下某快捷键:keybd_event使用方法
    如何使用存储过程来实现分页功能
    用ASP.NET实现下载远程图片保存到本地的方法 保存抓取远程图片的方法
  • 原文地址:https://www.cnblogs.com/klchang/p/6745338.html
Copyright © 2011-2022 走看看