Sử dụng một liên minh cho loại xảo quyệt là không di động (mặc dù không đặc biệt ít di động hơn bất kỳ phương pháp loại punning nào khác).
OTOH, một trình phân tích cú pháp, trong một ví dụ, thường có một liên minh để biểu diễn các giá trị trong biểu thức. [Chỉnh sửa: Tôi đang thay thế mẫu phân tích cú pháp bằng một ví dụ tôi hy vọng dễ hiểu hơn một chút]:
Hãy xem xét tệp tài nguyên Windows. Bạn có thể sử dụng nó để xác định các tài nguyên như menu, hộp thoại, biểu tượng, v.v. Một cái gì đó như thế này:
#define mn1 2
mn1 MENU
{
MENUITEM "File", -1, MENUBREAK
}
ico1 "junk.ico"
dlg1 DIALOG 100, 0, 0, 100, 100
BEGIN
FONT 14, "Times New Roman"
CAPTION "Test Dialog Box"
ICON ico1, 700, 20, 20, 20, 20
TEXT "This is a string", 100, 0, 0, 100, 10
LTEXT "This is another string", 200, 0, 10, 100, 10
RTEXT "Yet a third string", 300, 0, 20, 100, 10
LISTBOX 400, 20, 20, 100, 100
CHECKBOX "A combobox", 500, 100, 100, 200, 10
COMBOBOX 600, 100, 210, 200, 100
DEFPUSHBUTTON "OK", 75, 200, 200, 50, 15
END
Phân tích cú pháp MENU cho định nghĩa menu; phân tích cú pháp DIALOG cho một định nghĩa hộp thoại và vân vân. Trong trình phân tích cú pháp, chúng tôi biểu thị rằng dưới dạng công đoàn:
%union {
struct control_def {
char window_text[256];
int id;
char *class;
int x, y, width, height;
int ctrl_style;
} ctrl;
struct menu_item_def {
char text[256];
int identifier;
} item;
struct menu_def {
int identiifer;
struct menu_item_def items[256];
} mnu;
struct font_def {
int size;
char filename[256];
} font;
struct dialog_def {
char caption[256];
int id;
int x, y, width, height;
int style;
struct menu_def *mnu;
struct control_def ctrls[256];
struct font_def font;
} dlg;
int value;
char text[256];
};
Sau đó, chúng tôi chỉ định loại sẽ được tạo bằng cách phân tích một loại biểu thức cụ thể. Ví dụ, một định nghĩa font chữ trong file sẽ trở thành một thành viên font
của công đoàn:
%type <font> font
Chỉ cần làm rõ, phần <font>
đề cập đến các thành viên công đoàn đó là sản xuất và lần thứ hai "font" đề cập đến một quy tắc phân tích cú pháp mà sẽ mang lại kết quả của loại đó. Dưới đây là các quy tắc cho trường hợp cụ thể này:
font: T_FONT T_NUMBER "," T_STRING {
$$.size = $2;
strcpy($$.filename,$4);
};
Vâng, về mặt lý thuyết chúng ta có thể sử dụng một struct thay vì một công đoàn ở đây - nhưng ngoài lãng phí bộ nhớ, nó chỉ không có ý nghĩa. Định nghĩa phông chữ trong tệp chỉ xác định phông chữ. Nó sẽ không có ý nghĩa để có nó tạo ra một cấu trúc bao gồm một định nghĩa menu, định nghĩa biểu tượng, số, chuỗi, vv ngoài các font nó thực sự xác định. [cuối sửa]
Tất nhiên, việc sử dụng công đoàn để tiết kiệm bộ nhớ hiếm khi rất quan trọng nữa. Mặc dù thông thường nó có vẻ hơi tầm thường, nhưng khi RAM 64 Kb là rất nhiều, tiết kiệm bộ nhớ có ý nghĩa nhiều hơn.
vui lòng liên kết đến câu hỏi được trích dẫn và tới nguồn văn bản –
Tôi thực sự không nhớ chính câu hỏi đó (đây không phải là chủ đề ở đó, nhưng đã nêu lên một trong các nhận xét). Nguồn là '" C - Hướng dẫn tham chiếu ", 5th Ed., Harbison/Steele' – ysap
Đây có phải là nó không? http://stackoverflow.com/questions/3443751/converting-a-set-of-booleans-to-a-number/3443912#3443912 Nếu vậy, hãy xem nhận xét của tôi dưới cùng một câu trả lời đó. – wilhelmtell