【发布时间】:2015-07-06 18:28:07
【问题描述】:
问题
我正在做一些固件编码并且有很多位掩码需要管理。到目前为止,我一直在为要屏蔽的每个字段重复相同的块,如下所示:
#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(...) 调用(其中一些字段被广泛使用,导致维护噩梦)。
最后一个限制:我需要的字段稀疏地分散在数百个寄存器中。如果可能的话,我真的希望避免为每个字段定义一个struct,因为我通常只需要一个或两个字段。
【问题讨论】:
-
cpp 不能生成宏!使用代码生成器(例如用 Python 编写)生成适当的标头。
-
我在这里看不到任何位域。
-
制作一个生成内联函数的宏。
-
@ddriver: SO 11815894 很有趣,但最受好评的答案是 C++ 仅在实践中,尽管可以修改这些想法以使其与 C 一起使用。
标签: c macros c-preprocessor