背景信息:
我们有一个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);
但是,您的具体问题的真正解决方案可能是确保启用结构填充.你不应该得到任何不对准.
总结以上是内存溢出为你收集整理的编译时结构体大小检查,如果奇数出错全部内容,希望文章能够帮你解决编译时结构体大小检查,如果奇数出错所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)