1、gcc默认不报这个unpack无效,要加参数才行
gcc -Wall 1.cpp
1.cpp:13:0: warning: ignoring #pragma unpack [-Wunknown-pragmas]
#pragma unpack(1)
2、#pragma pack这个最好不用。如果一定要用,用的时候最好不手动写,而是封在宏里,以保证push/pop配对。
类似下面这种,其中__pragma是MSVC专有的关键字,专门为了在宏里面用而定制的。_Pragma是C99的。注意分号的位置的区分,有点ugly。
MSVC:
#define PACKED( class_to_pack ) __pragma( pack(push, 1) ) class_to_pack __pragma( pack(pop) )
PACKED(
struct tst_struct {
uint8_t a;
uint8_t b;
uint8_t c;
uint16_t d;
uint32_t e;
}
);
C99:
#define PRAGMA(X) _Pragma(#X)
#define PRAGMA_PACK_PUSH(n) PRAGMA(pack(push,n))
#define PRAGMA_PACK_POP() PRAGMA(pack(pop))
#define PACKED(class_to_pack) \
PRAGMA_PACK_PUSH(1) \
class_to_pack \
PRAGMA_PACK_POP()
PACKED(
struct tst_struct {
uint8_t a;
uint8_t b;
uint8_t c;
uint16_t d;
uint32_t e;
};
);
3、重要的结构(一般是对外接口,比如硬件映射、文件结构映射等),每个都用static_assert(sizeof(x) == y)保护一下
【 在 feiy 的大作中提到: 】
: 你们说对了,果然是头文件包含指向一个带pragma pack的头文件。
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*