c - 如何构建用于低级位屏蔽的 C 宏?

标签 c macros embedded bit-manipulation

我开始学习嵌入式 C 微 Controller 编程,并想做一些让我的生活更轻松的事情。通常,在处理位掩码时,每个人都会使用以下内容:

char a = (1 << 3) | (1 << 1) | (1 << 5);

我想使用宏来做这样的事情。对于一个掩码,我可以简单地定义这个宏:

#define M(n) (1 << (n))

没什么特别的。问题是我无法提供一个好的解决方案来让我输入:

a = MM( 3, 1, 5 ); 或至少 a = MM( 3, 3, 1, 5 ); (其中第一个 3 是参数的数量)

而不是a = M(3) |中号(1) | M(5);

我想出了一个解决方案,该解决方案意味着使用具有多个参数的函数,但我无法使用宏来做到这一点,这确实让我烦恼。

最佳答案

找到答案了。

#define M(a)        (1 << (a))
#define M2(a, b)    (M(a) | M(b))
#define M3(a, b...) (M(a) | M2(b))
#define M4(a, b...) (M(a) | M3(b))
// can be continued

#define GET_MACRO( _1, _2, _3, _4, NAME, ... ) NAME
#define MM(args...) GET_MACRO( args, M4, M3, M2, M )(args)

这使用 this thread 中的答案

关于c - 如何构建用于低级位屏蔽的 C 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24662192/

相关文章:

c - 在 C 中为位图文件指定数组中的十六进制值

macros - 在 clojure 中,如何从另一个宏评估宏的参数?

c - 寄存器的枚举和按位运算符

c - 如何从用户空间挂起 Linux 中的 i2c 设备?

c - QR算法实现3x3定点

c - 错误 : dereferencing pointer to incomplete type (Codeblocks, 在 C 中编程)

c - 位操作 -rotateLeft

c - C中的多重继承

macros - 在 macro_rules 中使用另一个宏而不需要使用rust 的 `extern crate`

c++ - Boost Serialization - 导出多个 CPP 文件