C语言如何通过宏定义实现调整位掩码常量顺序无需修改参数
实现方案1:依赖主流编译器通用扩展(最简单)
利用绝大多数编译器都支持的__COUNTER__预定义宏(每次调用自动递增1,初始值为0),实现自动按行序分配偏移:
#include <stdint.h> #define M(x) ( ((uint64_t) 1) << (x) ) // 记录当前计数器基准值,避免受前面代码的影响 #define POS_BASE __COUNTER__ // 每次调用返回当前行相对基准的偏移,自动从0开始递增 #define POS (__COUNTER__ - POS_BASE) // 仅需要调整下方三行的顺序,无需修改任何参数 #define My M(POS) #define Mz M(POS) #define Mx M(POS)
- 适用场景:GCC、Clang、MSVC等主流编译器覆盖的所有开发场景,是工业界通用的实现方式
- 注意事项:确保三个位定义宏紧挨着放在
POS_BASE定义之后,中间不要插入其他调用了__COUNTER__的代码即可
实现方案2:完全符合C标准(无编译器依赖)
如果需要兼容所有标准C编译器,可以用宏匹配的方式实现,只需要修改顺序配置行即可:
#include <stdint.h> #define M(x) ( ((uint64_t) 1) << (x) ) // 仅需要调整这一行的名字顺序,其余代码完全不用修改 #define POS_SEQ My, Mz, Mx // 以下为固定实现逻辑,无需改动 #define GET_POS0(a, b, c) 0 #define GET_POS1(a, b, c) 1 #define GET_POS2(a, b, c) 2 #define GET_POS(name, seq) GET_POS##seq(name) #define EXPAND_GET_POS(name, seq) GET_POS(name, seq) #define My M(EXPAND_GET_POS(My, (POS_SEQ))) #define Mz M(EXPAND_GET_POS(Mz, (POS_SEQ))) #define Mx M(EXPAND_GET_POS(Mx, (POS_SEQ)))
该方案不需要依赖任何编译器扩展,调整顺序时只需要修改POS_SEQ后三个宏的排列顺序即可。
内容的提问来源于stack exchange,提问作者Danijel
相关产品推荐
相关产品推荐

