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

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

概述如果sizeof(struct Astruct)不均衡,有没有办法使编译器保释 背景信息: 我们有一个16位的微处理器,如果16位的值错误对准,这将产生处理器对齐错误.在以下情况下可能会发生这种情况: typedef struct{ U8BIT u8BitValue1; U8BIT u8BitValue2; U8BIT u8BitValue3;} unevenAmoun 如果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 2typedef 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);

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

总结

以上是内存溢出为你收集整理的编译时结构体大小检查,如果奇数出错全部内容,希望文章能够帮你解决编译时结构体大小检查,如果奇数出错所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1247564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存