如果您能够使用 C++11,则可以利用使用alignof
运算符实现的对齐控件。
如果您不能使用 C++11 编译器,那么可以使用非标准替代方案来帮助您;在 GCC 中__attribute__(packed)
,在 MSVC 中#pragma pack
。
如果您选择的是 GCC 变体,则该属性必须放在结构的末尾:
class RTPHeader
{
int version:2; // The first two bits is version.
int P:1; // The next bits is an field P.
int X:1;
int CC:4;
int M:1;
int PT:7;
int sequenceNumber;
int64 timestamp;
.....
} __attribute__((packed)) ; // attribute here!
如果您选择的是 MSVC,则编译指示必须放在结构之前:
#pragma pack(1) // pragma here!
class RTPHeader
{
int version:2; // The first two bits is version.
int P:1; // The next bits is an field P.
int X:1;
int CC:4;
int M:1;
int PT:7;
int sequenceNumber;
int64 timestamp;
.....
};
如果您的代码必须同时编译,唯一的方法(没有 C++11alignof
运算符)是条件编译:
#ifdef MSVC
#pragma pack(1)
#endif
class RTPHeader
{
int version:2; // The first two bits is version.
int P:1; // The next bits is an field P.
int X:1;
int CC:4;
int M:1;
int PT:7;
int sequenceNumber;
int64 timestamp;
.....
#ifdef GCC
}__attribute__((packed));
#else
};
#endif