加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:29:45 所属栏目:百科 来源:网络整理
导读:如果sizeof(struct Astruct)不均衡,有没有办法使编译器保释 背景信息: 我们有一个16位的微处理器,如果16位的值错误对准,这将产生处理器对齐错误.在以下情况下可能会发生这种情况: typedef struct{ U8BIT u8BitValue1; U8BIT u8BitValue2; U8BIT u8BitValue
如果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的值是否必须是均匀的?

Lundin和Aaron 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);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读