问题
我正在进行一些固件编码,需要管理很多位掩码。到目前为止,我一直在为每个要屏蔽的字段重复相同的代码块,如下所示:
#define LinkStateMask 0x1
#define LinkStateShift 8
#define LinkState(x) (((x) >> LinkStateShift) & LinkStateMask)
请注意,这些字段往往是多位字段,因此掩码并不总是保证为
0x1
。最终的宏可以在代码中使用,并且非常易于阅读,我非常喜欢这一点:if( LinkState(temp) == 0 ) {
// Link is down, return error
return -ENODEV;
}
问题
有没有办法让C预处理器为我生成这些宏?我知道预处理器只能在单个过程中工作,所以一个宏不能直接定义另一个宏,但希望还有其他方法。
理想情况下,我希望编写类似以下内容的代码,并使用与上面第二个示例相同的C代码:
BIT_FIELD(LinkState, 8, 0x1) // BIT_FIELD(name, lsb, mask)
我的关键在于在主C文件中保留符号命名的函数式用法,而不必每次需要生成掩码时都编写整个`BIT_FIELD(...)`调用(其中一些字段被广泛使用,导致维护困难)。
最后一个限制:我需要的字段在数百个寄存器中零散分布。如果可能的话,我真的很想避免为每个字段定义一个结构体,因为我通常只需要其中的一个或两个字段。