Một cổ điển là đại diện cho một giá trị kiểu "không rõ", như trong cốt lõi của một máy ảo đơn giản:
typedef enum { INTEGER, STRING, REAL, POINTER } Type;
typedef struct
{
Type type;
union {
int integer;
char *string;
float real;
void *pointer;
} x;
} Value;
Sử dụng này, bạn có thể viết mã để xử lý "giá trị" mà không biết loại chính xác của họ , ví dụ thực hiện một ngăn xếp và như vậy.
Vì đây là trong (cũ, trước C11) C, công đoàn phải được đặt tên trường ở bên ngoài struct
. Trong C++, bạn có thể cho phép union
ẩn danh. Chọn tên này có thể khó. Tôi có xu hướng đi với một cái gì đó đơn chữ, vì nó gần như không bao giờ được tham chiếu trong sự cô lập và do đó nó luôn luôn rõ ràng từ bối cảnh những gì đang xảy ra.
Mã để đặt một giá trị cho một số nguyên có thể trông như thế này:
Value value_new_integer(int v)
{
Value v;
v.type = INTEGER;
v.x.integer = v;
return v;
}
Ở đây tôi sử dụng thực tế là struct
s có thể được trả trực tiếp, và điều trị gần giống như giá trị của một loại nguyên thủy (bạn có thể gán struct
s).
Tôi đoán cái này có thể hữu ích! – claf
Lưu ý rằng C11 cung cấp các công đoàn ẩn danh, vì vậy 'vì đây là đoạn C' áp dụng cho C90 và C99, nhưng không áp dụng cho C11.Tương tự như vậy, kể từ khi câu trả lời này được viết vào năm 2009, nó là khá hợp lý để không dự đoán những gì C11 sẽ cung cấp. –
@unwind vì tò mò, tôi hỏi câu hỏi này. Hàm trên không cung cấp _redeclaration error_? –