关于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 ...