【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