C/C++ 可变数量参数的宏定义

在 1999 年的 ISO C 标准中,宏可以声明为接受可变数量的参数,就像函数一样。定义宏的语法类似于函数的语法。下面是一个例子:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
这里的是一个可变参数。在调用这样的宏时,它代表零个或多个参数。这组标记替换了宏主体中出现的标识符 __VA_ARGS__

GCC 长期以来一直支持可变参数宏,并使用不同的语法,允许您像任何其他参数一样为变量参数命名。下面是一个例子:
#define debug(format, args...) fprintf (stderr, format, args)
这在所有方面都等同于上面的 ISO C 示例,但可以说更具可读性和描述性。

但是使用过上面两种形式的可变参数宏之后会发现一个问题,就是不能不传变量参数。
在标准 C 中,不允许完全忽略变量参数;但是你可以传递一个空参数。例如,👇🏻调用在 ISO C 中无效,因为字符串后没有逗号:
debug ("A message")

为了解决这个问题,CPP 对与标记粘贴运算符“##”一起使用的变量参数进行了特殊处理。形式如下:
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
如果变量参数被省略或为空,“##”运算符会导致预处理器删除它前面的逗号。如果在宏调用中提供了一些变量参数,GNU CPP 会将变量参数放在逗号之后。就像任何其他粘贴的宏参数一样,这些参数不是宏扩展的。

posted @   柴承训  阅读(619)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示
主题色彩