我需要一个宏,将其(可变数量的)参数按位或组合在一起:
int main() {
printf("%d\n", BITWISE_OR_MULTIPLE_ARGS(1, 2, 4));
printf("%d\n", BITWISE_OR_MULTIPLE_ARGS(1, 2, 4, 8, 16));
}
这应该打印:
7
31
我有一个使用P99的解决方案:
#include "p99/p99_for.h"
#define P00_IDT(NAME, X, I) X
#define BITWISE_OR_MULTIPLE_ARGS(...) P99_FOR(A, P99_NARG(__VA_ARGS__), P00_BOR, P00_IDT, __VA_ARGS__)
但是,这是我的代码库中唯一使用 P99 的情况,我发现导入所有 P99 有点重量级。我怎样才能用一组独立的宏来实现这一点?
您可以使用这个答案中的方法。
例如最多有 5 个参数:
#include <stdio.h>
#define BOR2(a,b) ((a) | (b))
#define BOR3(a,b,c) (BOR2(a,b) | (c))
#define BOR4(a,b,c,d) (BOR3(a,b,c) | (d))
#define BOR5(a,b,c,d,e) (BOR4(a,b,c,d) | (e))
#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME
#define BITWISE_OR_MULTIPLE_ARGS(...) GET_MACRO(__VA_ARGS__, BOR5, BOR4, BOR3, BOR2)(__VA_ARGS__)
int main()
{
printf("%d\n", BITWISE_OR_MULTIPLE_ARGS(1, 2, 4));
printf("%d\n", BITWISE_OR_MULTIPLE_ARGS(1, 2, 4, 8, 16));
return 0;
}