首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >struct { ... }和struct { union { struct { ... }}有什么区别?

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

Stack Overflow用户
提问于 2011-09-11 13:48:53
回答 4查看 477关注 0票数 5

有没有什么原因让DISK_DETECTION_INFO is defined as

代码语言:javascript
复制
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;

而不是

代码语言:javascript
复制
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;

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-11 14:11:15

可以说,这是一个错误。然而,有可能我们只得到了结构的公开定义。在内部(当由Windows内核使用时),它可能被定义为:

代码语言:javascript
复制
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;

我不认为这是可维护的、安全的或可移植的,但这是可能的。

DISK_INTERNAL_INFO甚至可以超过匿名struct的大小--如果用户自己从不实例化对象,那么这项技术甚至可以被认为是对用户隐藏额外数据但将其保留在结构中的有用方法。他们永远不会“看到”匿名的struct

票数 6
EN

Stack Overflow用户

发布于 2011-09-11 14:47:53

这两种行为之间有一个非常具体的区别:在第一种情况下,在初始化DISK_DETECTION_INFO时,Int13ExtInt13都不会初始化。在后一种情况下,所有四个字段都被初始化。

MSVC有许多奇怪的扩展,包括结构末尾的可变大小数组,对于这些扩展,自动初始化行为可能是不可取的。

编辑:关于“初始化”:

假设结构是

代码语言:javascript
复制
typedef struct _foo {
  int bar;
  union {
    struct {
      int baz;
      int wee;
    };
  };
} foo;

然后,编写foo x = { 1; }不会给baz或wee赋值(它们在技术上是不确定的)。如果结构是

代码语言:javascript
复制
typedef struct _foo {
  int bar;
  int baz;
  int wee;
} foo;

然后,编写foo x = { 1; }会为baz=0和wee=0赋值

票数 0
EN

Stack Overflow用户

发布于 2011-09-11 15:01:59

我认为有合理的证据表明,有人在编写原始的DISK_DETECTION_INFO结构定义时犯了一个简单的错误。这个错误逃到了野外,所以要纠正它已经太晚了。

头文件中的定义为:

代码语言:javascript
复制
typedef struct _DISK_DETECTION_INFO {
        DWORD SizeOfDetectInfo;
        DETECTION_TYPE DetectionType;
        union {
                struct {

                        //
                        // If DetectionType == DETECTION_INT13 then we have just the Int13
                        // information.
                        //

                        DISK_INT13_INFO Int13;

                        //
                        // If DetectionType == DETECTION_EX_INT13, then we have the
                        // extended int 13 information.
                        //

                        DISK_EX_INT13_INFO ExInt13;     // If DetectionType == DetectExInt13
                } DUMMYSTRUCTNAME;
        } DUMMYUNIONNAME;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;

文档内容如下:

如果DetectionType为DetectInt13,则联合为DISK_INT13_信息结构。

如果DetectionType为DetectExInt13,则联合为DISK_EX_ INT13_INFO结构。

因此,由于DISK_INT13_INFODISK_EX_INT13_INFO是相互排斥的,因此它的原始意图很可能是将它们放在一个联盟中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7376552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档