编译时结构体大小检查,如果奇数出错

前端之家收集整理的这篇文章主要介绍了编译时结构体大小检查,如果奇数出错前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果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值的数量是非常容易出错的,我们已经有相当一段时间,我们以为“嘿,它不工作”,一个小时或以后,哦! Darn,忘记调整值的定义.

一个首选的方法是使用sizeof运算符,但是它不能用于错误检查,我真的很想保留.

那么有没有使用sizeof运算符,并保留一些形式的错误检查U8BIT的值是否必须是均匀的?

LundinAaron McDaid组合解决方案:

#define COMPILE_TIME_ASSERT(expr) {typedef U8BIT COMP_TIME_ASSERT[((!!(expr))*2-1)];}

解决方法

使用C11编译器,使用:
static_assert (sizeof(the struct) % 2 == 0,"Misaligned");

使用较旧的编译器,您可以使用肮脏的技巧

#define COMPILE_TIME_ASSERT(expr) {typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0];}

...

COMPILE_TIME_ASSERT(sizeof(the_struct) % 2 == 0);

但是,您的具体问题的真正解决方案可能是确保启用结构填充.你不应该得到任何不对准.

猜你在找的C&C++相关文章