【GNU笔记】【C扩展系列】参数数目可变的宏 Macros with a Variable Number of Arguments

【GNU笔记】【C扩展系列】参数数目可变的宏 Macros with a Variable Number of Arguments.

在1999年的ISO C标准中,宏可以声明为接受可变数量的参数,就像函数一样。定义宏的语法类似于函数。下面是一个例子:

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

这里的“…”是一个可变参数 (variable argument)。在这种宏的调用中,它表示零个或多个标记,直到结束调用的右括号为止,包括任何逗号。这组标记将替换宏主体中出现的标识符__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 对与标记粘贴操作符“##”一起使用的变量参数进行了特殊处理。如果你写

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

并且如果变量参数被省略或为空,’ ## '操作符会导致预处理器删除它前面的逗号。如果你在宏调用中提供了一些变量参数,GNU CPP 不会抱怨粘贴操作(paste operation),而是将变量参数放在逗号之后。就像其他粘贴的宏参数一样,这些参数不会被宏扩展。


[参考资料]

6.21 Macros with a Variable Number of Arguments.

本文链接:https://blog.csdn.net/u012028275/article/details/128891939

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值