sizeof (struct Astruct)
如果不均匀,是否有任何可能的方法使编译器退出?
背景信息:我们有一个 16 位微处理器,如果 16 位值未对齐,它将给出处理器对齐错误。这可能发生在以下场景中:
typedef struct
{
U8BIT u8BitValue1;
U8BIT u8BitValue2;
U8BIT u8BitValue3;
} unevenAmountOf8BitValues;
typedef struct
{
U16BIT u16BitValue1;
U16BIT u16BitValue2;
} my16BitValues;
#define U8BIT_COUNT 3
#define U16BIT_COUNT 2
typedef struct
{
unevenAmountOf8BitValues u8BitValues;
my16BitValues u16BitValues;
} valuesCombined;
typedef union
{
valuesCombined myValues;
U8BIT buffer[sizeof(valuesCombined)];
struct
{
U8BIT bufferU8[U8BIT_COUNT];
U16BIT bufferU16[U16BIT_COUNT]; /* <<-- missalignment */
} valuesPerType;
} myValuesInRamAndRom
我们现在要做的是手动计算 U8BIT/U16BIT/U32BIT 值的数量(嗯,使用 excel 跟踪数量)并将其放入U(8/16/32)BIT_COUNT
定义中,然后如下:
#if U8BIT_COUNT % 2 == 1
#error The number of U8BIT parameters need to be even, add a dummy
#endif
跟踪 U8-/U16-/U32BIT 值的数量很容易出错,而且我们有很多时候在想“嘿,它不工作”,一个小时或之后,哦!该死,忘记调整定义的值的数量。
一种首选方法是使用 sizeof 运算符,但它不能用于错误检查,我真的很想保留它。
那么无论如何使用 sizeof 运算符并保持某种形式的错误检查 U8BIT 值的数量必须是偶数吗?
Lundin和Aaron McDaid的联合解决方案:
#define COMPILE_TIME_ASSERT(expr) {typedef U8BIT COMP_TIME_ASSERT[((!!(expr))*2-1)];}