C 宏对可变数量的参数进行按位或运算(没有 P99 的轻量级解决方案)

问题描述 投票:0回答:1

我需要一个宏,将其(可变数量的)参数按位或组合在一起:

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 有点重量级。我怎样才能用一组独立的宏来实现这一点?

c c-preprocessor
1个回答
0
投票

您可以使用这个答案中的方法。

例如最多有 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.