2012-07-04 40 views
8

我已經使用位域這樣的結構,聯合使用位域是否有效?

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

現在我想看看這是否可以爲聯合完成,所以我修改了代碼一樣,

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

我找到了用聯合工作的位字段,但聯合中的所有這些字段被賦予一個位,就像我從輸出中理解的那樣。現在我看到使用聯合位字段並不是錯誤的,但在我看來,像這樣使用它在操作上是不正確的。那麼答案是什麼 - 它是否適用於聯合使用位域?

+0

請,什麼不能正常運行? – alk

回答

12

給你一把槍和子彈。用腳步射擊自己可以嗎?當然不是,但如果你願意,沒有人能阻止你這樣做。

我的觀點是,就像槍和子彈一樣,聯合體和位域是工具,它們有其目的,用途和「濫用」。因此,如上所述,在聯合中使用位域是完全有效的C,但是是無用的一段代碼。聯合內部的所有字段共享相同的內存,所以你提到的所有位域基本上是相同的標誌,因爲它們共享相同的內存。

12

這是有效的,但你發現了,沒有用你在那裏做的方式。

你可能會這樣做,所以你可以使用標誌同時重置所有的位。

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

或者你可以做這樣的事情:

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

假設你想要匿名結構,我已經添加了一些分號。還要注意它們不是標準的C.在gcc中,你必須使用'-fms-extensions'來使它們工作。 – unkulunkulu