![](/img/trans.png)
[英]What's the difference between `typedef struct X { }` and `typedef struct { } X`?
[英]What's the difference between struct { … } and struct { union { struct { … } } }?
將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;
代替
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;
或者我只是過度分析這段代碼?
可以說,這是一個錯誤。 但是,我們可能只給出了結構的公共定義。 在內部(當由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;
我不會將其作為可維護,安全或便攜的志願服務,但這是可能的 。
DISK_INTERNAL_INFO
甚至可能超過匿名struct
的大小 - 假設用戶從不實例化對象本身,該技術甚至可能被認為有用於將額外數據隱藏在用戶之外但保留結構。 他們永遠不會“看到”過去的匿名struct
。
行為之間存在非常明顯的差異:在第一種情況下,當初始化DISK_DETECTION_INFO
時, Int13
和ExtInt13
DISK_DETECTION_INFO
初始化。 在后一種情況下,所有四個字段都被初始化。
MSVC有一系列古怪的擴展,包括結構末尾的可變大小的數組,其自動初始化行為可能是不合需要的。
編輯:關於“初始化”:
讓我們說結構是
typedef struct _foo {
int bar;
union {
struct {
int baz;
int wee;
};
};
} foo;
然后,寫foo x = { 1; }
foo x = { 1; }
沒有為baz或wee賦值(它們在技術上是不確定的)。 如果結構是
typedef struct _foo {
int bar;
int baz;
int wee;
} foo;
然后,寫foo x = { 1; }
foo x = { 1; }
不分配巴茲= 0和凌晨= 0
我認為有合理的證據表明有人在編寫原始的DISK_DETECTION_INFO
結構定義時犯了一個簡單的錯誤。 這個錯誤逃到了野外,所以修復它已經太晚了。
頭文件中的定義是:
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,則union是DISK_INT13_ INFO結構。
如果DetectionType是DetectExInt13,則union是DISK_EX_ INT13_INFO結構。
因此,最初的意圖似乎很可能是將DISK_INT13_INFO
和DISK_EX_INT13_INFO
放在一個聯合中,因為它們是互斥的。
當一組字段具有互斥訪問權限時,Union通常用於節省空間。 也就是說,當一個活躍時,另一個活動不能。 與為所有字段分配空間相反,空間僅分配給最大的空間。 該空間可與其他領域互換使用。 如鏈接中所述,取決於DetectionType字段,它是Int13或ExInt13是活動的。 兩者都使用相同的分配空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.