如果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的值是否必须是均匀的?
#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);
但是,您的具体问题的真正解决方案可能是确保启用结构填充.你不应该得到任何不对准.