2012-07-04 18 views
8

Tôi đã sử dụng trường bit với một cấu trúc như thế này,Có hợp lệ để sử dụng các trường bit với công đoàn không?

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

Bây giờ tôi tự hỏi để xem nếu điều này có thể được thực hiện với một liên minh vì vậy tôi sửa đổi mã như,

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

Tôi tìm thấy trường bit với các công trình nghiệp đoàn nhưng tất cả các trường đó trong công đoàn được gán cho một bit như tôi đã hiểu từ đầu ra. Bây giờ tôi thấy nó không phải là sai lầm để sử dụng các lĩnh vực bit với công đoàn, nhưng có vẻ như với tôi rằng việc sử dụng nó như thế này là không hoạt động chính xác. Vậy câu trả lời là gì - liệu nó có hợp lệ để sử dụng trường bit với union?

+0

Xin vui lòng, những gì không hoạt động một cách chính xác? – alk

Trả lời

12

Bạn được tặng một khẩu súng và đạn. Bạn có thể tự chụp chân mình không? Tất nhiên là không, nhưng không ai có thể ngăn cản bạn làm điều này nếu bạn muốn.

Quan điểm của tôi là, giống như súng và đạn, công đoàn và các trường bit là công cụ và chúng có mục đích, sử dụng và "lạm dụng". Vì vậy, sử dụng bitfields trong công đoàn, như bạn đã viết ở trên, là hoàn toàn hợp lệ C nhưng một đoạn vô dụng của mã. Tất cả các lĩnh vực bên trong công đoàn chia sẻ cùng một bộ nhớ để tất cả các bitfields bạn đề cập về cơ bản là cùng một lá cờ khi họ chia sẻ cùng một bộ nhớ.

12

Nó hợp lệ nhưng khi bạn phát hiện ra, không hữu ích theo cách bạn đã thực hiện ở đó.

Bạn có thể làm một cái gì đó như thế này để bạn có thể đặt lại tất cả các bit cùng một lúc bằng cách sử dụng cờ.

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

Hoặc bạn có thể làm điều gì đó như thế này:

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

Tôi đã thêm một số dấu chấm phẩy giả sử bạn muốn cấu trúc ẩn danh. Cũng lưu ý rằng chúng không phải là tiêu chuẩn C. Trong gcc, bạn phải sử dụng '-fms-extensions' để chúng hoạt động. – unkulunkulu

Các vấn đề liên quan