关于c语言位域的字节对齐问题

最近在STM32F4上面进行嵌入式开发,需要做通讯,报文规定的字段并不以字节为最小单位,好多2,3位的长度元素 对于C语言,我们一般用位域来解决。

可是,C教科书上给我们讲的位域不占用很多空间的前提没有讲述清楚,经查证,默认情况下C语言并没有规定统一 的字节对齐策略,导致用sizeof计算结构大小的时候结果在不同的平台上结果五花八门。下面代码的结构体,按理是 4个字节,结果默认情况下gcc计算结果为6。

网络资料显示需要对结构体加pack属性, 这下GCC是对了,但是在win平台下面的MinGW结构居然是5
???

玩我呢? 后面搜索MinGW 位域对齐问题,发现MinGW并不像我想象的就是GCC,跟linux平台和cygwin并不完全相同, 至少这个地方表现跟VC++平台一致。

好了,用pragma来指定按字节对齐的方式,按1字节对齐,这样位域才能正确。

代码如下:

#include <QCoreApplication>

#include <stdint.h>

#if defined WIN32 || defined _WIN64 || defined WINNT
    #pragma pack(push,1)
#endif

struct …
more ...