我对C不太确定,但是C++允许使用长度为0的未命名位域。例如:
struct X
{
int : 0;
};
编辑,以解决冰罪行后的示例
编辑:好,由于当前的答案,我现在知道了理论上的目的。但是问题是关于实际用途的,因此它们仍然存在:)
最佳答案
您可以使用零长度位域作为一种怪异的方法,以使编译器布局结构以匹配某些外部需求,无论是其他编译器还是体系结构的布局概念(跨平台数据结构,例如二进制文件格式) )或位级别标准的要求(网络数据包或指令操作码)。
一个真实的例子是NeXT将xnu内核从Motorola 68000(m68k)架构移植到i386架构时。 NeXT的内核版本为m68k。当他们将其移植到i386时,他们发现i386的对齐要求与m68k的对齐要求不同,以致m68k机器和i386机器在NeXT供应商特定的BOOTP结构的布局上不一致。为了使i386结构布局与m68k一致,他们添加了一个长度为零的未命名位域,以将NV1
结构/nv_U
联合强制为16位对齐。
以下是Mac OS X 10.6.5 xnu源代码中的相关部分:
/* from xnu/bsd/netinet/bootp.h */
/*
* Bootstrap Protocol (BOOTP). RFC 951.
*/
/*
* HISTORY
*
* 14 May 1992 ? at NeXT
* Added correct padding to struct nextvend. This is
* needed for the i386 due to alignment differences wrt
* the m68k. Also adjusted the size of the array fields
* because the NeXT vendor area was overflowing the bootp
* packet.
*/
/* . . . */
struct nextvend {
u_char nv_magic[4]; /* Magic number for vendor specificity */
u_char nv_version; /* NeXT protocol version */
/*
* Round the beginning
* of the union to a 16
* bit boundary due to
* struct/union alignment
* on the m68k.
*/
unsigned short :0;
union {
u_char NV0[58];
struct {
u_char NV1_opcode; /* opcode - Version 1 */
u_char NV1_xid; /* transcation id */
u_char NV1_text[NVMAXTEXT]; /* text */
u_char NV1_null; /* null terminator */
} NV1;
} nv_U;
};