我开始学习编程嵌入式C微控制器,并希望做一些让我的生活更轻松的事情。通常在处理位屏蔽时,每个人都会使用以下内容:
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) | M(1) | M(5);
我提出了一个解决方案,暗示使用具有多个参数的函数,但它真的让我烦恼,我不能使用宏来做它。
答案 0 :(得分:2)
找到答案。
#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
中的答案答案 1 :(得分:1)
也许这会有所帮助:
#define BITMASK_SET(x,y) ((x) |= (y))
#define BITMASK_CLEAR(x,y) ((x) &= (~(y)))
#define BITMASK_FLIP(x,y) ((x) ^= (y))
#define BITMASK_CHECK(x,y) ((x) & (y))
答案 2 :(得分:0)
使用boost
#include <boost/preprocessor/tuple/to_seq.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/control/if.hpp>
#define M(n) (1 << (n))
#define F(r, data, i, elem) BOOST_PP_IF(i, data, ) M(elem)
#define MM(...) BOOST_PP_SEQ_FOR_EACH_I(F, | , BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)) )
...
char a = MM(3, 1, 5);//char a = (1 << (3)) | (1 << (1)) | (1 << (5)) ;