c - 输出由 `||` 分隔的参数的 Variadic 宏

标签 c c-preprocessor variadic-macros

我想制作一个宏 F,它采用可变数量的参数,扩展为每个参数由 || 分隔。例如F(a, b, c) 应该扩展为 a || b || cF(a) 应该扩展为 a,等等。

我知道 C 不支持递归宏。我目前最多只需要 4 个参数。

我在想像 #define F(a, ...) a || 这样的东西F(__VA_ARGS__),然后是第二个宏以使其扩展 4 倍,但我完全不确定另一个宏应该是什么样子。我在某个时候遇到了一个空的 __VA_ARGS__ 的问题。任何其他想法将不胜感激。

限制:必须与任何符合标准的 C99 编译器一起使用。

编辑:我已经使用 Overloading Macro on Number of Arguments 完成了这项工作,但仍然很好奇是否还有其他解决方案。

最佳答案

基础很简单:

#define COUNT(...) COUNT_(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_(A0, A1, A2, A3, A4, A5, A6, A7, ...) A7

#define F0()
#define F1(A0) A0
#define F2(A0, A1) A0 || A1
#define F3(A0, A1, A2) F2(A0, A1) || A2
#define F4(A0, A1, A2, A3) F3(A0, A1, A2) || A3

#define F(...) C(F, COUNT(__VA_ARGS__))(__VA_ARGS__)
#define C(X, Y) C_(X, Y)
#define C_(X, Y) X ## Y

其中 C 是通常的两步连接宏。不过,还有一个问题:空的 __VA_ARGS__

实际上,这不受 C 标准本身的支持(您必须切换到即将推出的 C++20,或者可能是 C20 向后移植?)。而且任务非常繁重(因为 COUNT() 返回 1,其中 COUNT_ 宏中的第一个参数是空的!)。我很久以前就为类似的任务解决了这个问题,所以你可能想看看 there , 应该很容易将相关部分导入到这里...

关于c - 输出由 `||` 分隔的参数的 Variadic 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983654/

相关文章:

c - 可靠的UDP实现设计问题

c - 当我运行代码时,它在终端上显示一些错误。谁能告诉我错误代表什么?我该如何调试它?

c++ - 字符串化 __VA_ARGS__ (C++ 可变参数宏)

c++ - 调用可变参数宏的可变参数函数

我可以使用预处理器使这一点更清楚吗?

c++ - 如何增强这个变量转储调试宏的可变性?

c - 使用C设置apache环境变量,功能类似PHP apache_setenv函数

c - 试图更好地理解 switch 语句以及它们的表达式如何相关/测试

c++ - 宏中的宏

使用 C 宏调用关联*函数