struct {...}和struct {union {struct {...}}}之间有什么区别?

Meh*_*dad 5 c winapi struct unions

有没有理由DISK_DETECTION_INFO被定义为

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  union {
    struct {
      DISK_INT13_INFO    Int13;
      DISK_EX_INT13_INFO ExInt13;
    };
  };
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
Run Code Online (Sandbox Code Playgroud)

代替

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  DISK_INT13_INFO    Int13;
  DISK_EX_INT13_INFO ExInt13;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
Run Code Online (Sandbox Code Playgroud)

或者我只是过度分析这段代码?

ta.*_*.is 6

可以说,这是一个错误.但是,我们可能只给出了结构的公共定义.在内部(当由Windows内核使用时),它可以定义为:

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  union {
    struct {
      DISK_INT13_INFO    Int13;
      DISK_EX_INT13_INFO ExInt13;
    };
    DISK_INTERNAL_INFO   Private; // Used internally, when DetectionType = -1
  };
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
Run Code Online (Sandbox Code Playgroud)

我不会将其作为可维护,安全或便携的志愿服务,但这是可能的.

DISK_INTERNAL_INFO甚至可能超过匿名的大小struct- 假设用户从不实例化对象本身,该技术甚至可能被认为对于将额外数据隐藏在远离用户但将其保留在结构中有用.他们永远不会"看到"过去的匿名者struct.