为了节省嵌入式C项目中的空间,我使用位字段来索引一些小数组。因为位字段大小必须是常量,这意味着定义两个相互依赖的常量,如果一个或另一个独立更改,则相应的错误可能性。
我正在寻找一种方法来使用预处理器来检查定义的位字段大小是否足以包含数组大小。这应该会产生编译错误。
答案 0 :(得分:1)
使用预处理器常量来定义位域大小(可能有一种方法可以实现编译时断言而不会这样做,但它不会立即浮现在我的脑海中。)
#define WIDGET_COUNT_BITS 5
#define WIDGET_MAX ((size_t)(1 << WIDGET_COUNT_BITS - 1))
struct widget_list {
unsigned count : WIDGET_COUNT_BITS;
};
如果数组大小由预处理器常量定义,则可以使用预处理器来获取错误消息。
#define FROBNICATOR_WIDGET_COUNT 42
#if FROBNICATOR_WIDGET_COUNT > WIDGET_MAX
#error "Too many widgets in the frobnicator module"
#endif
widget_t widgets[FROBNICATOR_WIDGET_COUNT];
否则,如果你想要一个基于sizeof
值的编译时错误,一个经典的技巧就是构建一个数组类型,如果数组大小为0,大多数编译器都会拒绝。参见{{3} }。 Static assert in C为此,但编译器支持尚未普及。