我想制作一个宏 F
,它采用可变数量的参数,扩展为每个参数由 ||
分隔。例如F(a, b, c)
应该扩展为 a || b || c
,F(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/