我对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;
    };
    

    10-06 13:34