Bạn thực sự không thể quyết định cách giải quyết vấn đề này mà không biết điều gì đó được sử dụng như thế nào. Nếu nó chỉ được sử dụng để tiết kiệm không gian, thì bạn có thể bỏ qua nó và chỉ sử dụng một cấu trúc.
Tuy nhiên, đó thường không phải là lý do tại sao các công đoàn được sử dụng. Có hai lý do phổ biến để sử dụng chúng. Một là cung cấp 2 hoặc nhiều cách để truy cập cùng một dữ liệu. Ví dụ, một liên minh của một int và một mảng 4 byte là một (nhiều) cách để tách các byte của một số nguyên 32 bit.
Khác là khi dữ liệu trong cấu trúc đến từ nguồn bên ngoài, chẳng hạn như gói dữ liệu mạng. Thông thường, một phần tử của cấu trúc kèm theo liên minh là một ID cho bạn biết hương vị của liên minh nào có hiệu lực.
Trong cả hai trường hợp này, bạn có thể bỏ qua công đoàn một cách mù quáng và chuyển đổi nó thành cấu trúc trong đó hai (hoặc nhiều trường) không trùng khớp nhau.
Nguồn
2008-09-24 15:37:33
Có thể an toàn hơn nhưng khi bạn tương tác với thư viện C cung cấp các loại cấu trúc dữ liệu này, quyết định này sẽ phá vỡ ngay cả cấu trúc C/C++ thô sơ của bạn. Tôi đang cố gắng để đối phó với một cái gì đó như thế này: struct LibrarySType {AnotherType * anotherTypeBuff; int oneSetOfFlags; int anotherSetOfFlags; union {struct {int structMember1; ...} oneUseOfThisLibraryType; struct {char * structMember2; ...} anotherUseOfThisLibraryType; ...} u; int64 * moreStuff; ...Bây giờ tôi không tạo ra cấu trúc dữ liệu thông minh này, nhưng nó là một phần của API của nhà cung cấp, tôi cần –