2014-04-01 57 views
0

例如,這個代碼是從USB設備的固件:C - 爲什麼把一個結構放在一個union中?

typedef union HID_CONTROLS_TYPEDEF 
{ 
    struct 
    { 
     BYTE B1:1;  //buttons 
     BYTE B2:1; 
     BYTE B3:1; 
     BYTE B4:1; 
     BYTE B5:1; 
     BYTE B6:1; 
     BYTE Bpad:2; //filler 
    } buttons; 
} HID_CONTROLS; 

爲什麼是工會內部的結構,這會產生什麼影響?它不會只是一個結構?

回答

3

在這種情況下,你是對的,這是多餘的。

但是,在過去的某個時候,工會可能還會攜帶一個8位字符以方便映射。

或者他們認爲它可能在未來。

這是我的猜測,我強調,這只是一個猜測。但是,這只是推測的原因,而且是一個相當有教育意義的推測。

struct的過度熒光(?)是給定的,而不是猜測。

2

這意味着如果結構是在聯合之外採取相同的。我唯一能想到的是它強制代碼包含buttons。比如你寫:

controls.buttons.B1 = ...; 

而不是

controls.B1 = ...; 

因此,也許作者認爲,這是自文檔。

1

是的,它會的。我猜測該聯合最初是爲了防止數據需要作爲整個字節來編寫的,因此填充程序將其填充到8位。低級嵌入並不罕見。

發現不需要訪問整個字節,但工會剛剛進入,因爲沒有理由將其取出。

代碼慣性。

1

是的,它應該,除非我失去了一些東西。我看到這個代碼有兩個可能的原因:一個是過去的,另一個是未來的;-)。

可能曾經有一個int作爲聯合中的結構的替代;或者可能有計劃在未來增加一個。這兩種方法都會使包裝變得更加合理,因爲未來的或過去的變更並未使用戶代碼變更變得必要。

相關問題