Tôi sẽ giả định rằng myState
có loại enum State
của bạn.
Việc sử dụng truyền thống của enum
là tạo các giá trị không đổi mà một biến loại này có thể thực hiện. Bạn muốn đặt biến số myState
thành số kết hợp của các giá trị được xác định trong enum
.
enum
xác định 1, 2, 4 và 8 làm giá trị hợp lệ, nhưng bạn muốn có thể đặt biến thành 4 | 2 = 6. Trong khi C sử dụng loại int
được triển khai của bạn cho tất cả enum
, nó không phải là trường hợp trong C++. myState = 6
không hợp lệ trong C++. Trên thực tế, myState = 4
không hợp lệ trong C++, bạn cần truyền một cách rõ ràng hoặc sử dụng một trong các tên không đổi của enum
.
Mặc dù có thể trong C, thực hành không tốt là đặt myState
thành giá trị không được xác định theo loại của nó (ví dụ đến 6).
Trong trường hợp của bạn, một giải pháp mà dường như hậu quả sẽ là:
typedef enum {
OTHER,
MINIMIZED,
MAXIMIZED
} win_size_t;
typedef struct {
win_size_t current;
win_size_t next;
} state_t;
state_t myState;
Bằng cách đó, bạn có thể viết thư cho các lĩnh vực current
và next
undependently.
Nếu bạn vẫn muốn có các trường bit, bạn có thể đặt kích thước của các phần tử của cấu trúc theo bit. Nó là loại nguy hiểm mặc dù, việc thực hiện các lĩnh vực bit phụ thuộc vào trình biên dịch của bạn. Tôi thậm chí không chắc chắn nếu trình biên dịch sẽ chấp nhận để có một loại enum trong một lĩnh vực bit (nên được ok trong C, kể từ enum
s là int
).
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
Các giải pháp đã cho trước đó là hợp lệ.Quan điểm của tôi là nếu biến số myState
của bạn có loại enum State
, nó chỉ nên sử dụng các thành viên của enum
cho các giá trị của nó, không phải kết hợp.
Có thể myState
có loại khác, tôi biết điều gì.
Nếu myState
không phải là loại enum State
, sau đó bạn có thể sử dụng các hằng số được định nghĩa trong enum
của bạn kết hợp.
enum State {
MINIMIZING = (1u << 0),
MAXIMIZING = (1u << 1),
MINIMIZED = (1u << 2),
MAXIMIZED = (1u << 3),
};
unsigned int myState = 0;
myState |= MAXIMIZED; // sets that bit
myState &= ~MAXIMIZED; // resets that bit
này cho phép bạn làm hai việc trong một công việc:
myState = MAXIMIZED | MINIMIZING;
Nhưng cũng có những thứ bạn không có khả năng muốn:
myState = MAXIMIZED | MINIMIZED; // does that make sense?
cảm ơn! Tôi đã đi cho tùy chọn # 1. Thật vậy mà không có cảm giác rằng 'MAXIMIZED | MINIMIZED' là có thể, và cho nó tốt hơn cho khả năng đọc để có hai enums. –
Xin lưu ý rằng việc hạn chế liệt kê các bit được đệ trình là hành vi không xác định và kết quả phụ thuộc vào trình biên dịch. Ngoài ra xin vui lòng sửa tôi Nếu tôi sai. –
@ DavidTóth Bạn có vẻ đúng, cảm ơn vì điều này! https://stackoverflow.com/a/33590935/108802 – Gauthier