位域长度不应超过类型长度
6.9.2 ID_exceededBitfield
位域长度超过类型长度易误导维护者,而且也可能是笔误。
C 标准不允许位域长度超过类型长度,但 C++ 标准允许,超过的部分作为“padding bits”不参与数据的存储。
示例:
struct A {
uint32_t x: 64; // Non-compliant
} a;
a.x = UINT64_MAX; // Truncated
例中 x 的位域长度超过了类型长度,但有效位域长度仍为 32,有效位域和声明位域不一致易误导维护者,造成截断或溢出等错误。
如果是为了特殊的对齐,可改用成员占位的方式:
struct A {
int32_t x; // Compliant
int32_t padding; // Compliant
};
成员 padding 特殊的名称表明它是用于占位的特殊成员,这种方式比位域更有利于维护。
依据
ISO/IEC 9899:1999 6.7.2.1(3)
ISO/IEC 9899:2011 6.7.2.1(4)
ISO/IEC 14882:2003 9.6(1)
ISO/IEC 14882:2011 9.6(1)