Cấu trúc ẩn danh/công đoàn không phải là một phần của tiêu chuẩn C, mà là một phần mở rộng GNU không phổ biến rộng rãi.
Trong ví dụ cụ thể của bạn, một số trình biên dịch (chủ yếu là GCC) sẽ cho phép bạn truy cập vào các biến duy nhất của người quản lý và nhân viên thông qua ví dụ: company[i].shares
hoặc company[i].department
, nhưng company[i].age
không rõ ràng và trình biên dịch sẽ không biết cái nào có nghĩa là gì. Cách tiếp cận của bạn cũng giống như cố gắng để xác định
union {
int num;
float num;
} union_number;
mà thậm chí không hợp lệ C.
có hai cách để giải quyết này.
a) di chuyển các thuộc tính chia sẻ ngoài struct (GNU cách ác, xin đừng làm điều đó, tôi biết một thực tế rằng icc thậm chí không biên dịch này)
union employee
{
char key;
struct person {
short int age;
union {
struct manager
{
float shares;
short int level;
};
struct worker
{
short int skill;
short int department;
};
}
};
} company[10];
b) hoặc cách chuẩn sạch hơn để đặt tên struct của bạn:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
} manager;
struct worker
{
short int age;
short int skill;
short int department;
} worker;
} company[10];
trong trường hợp này bạn sẽ có thể truy cập vào các yếu tố cấu trúc qua company[i].manager.age
, company[i].worker.skill
và vân vân.
Hãy chú ý rằng tại thời gian chạy không có cách nào để kiểm tra xem công đoàn của bạn có chứa khóa, người quản lý hoặc nhân viên hay không. Điều đó phải được biết trước.
Một điều nữa: Tôi không chắc chắn nếu dự định này, nhưng trong tuyên bố của bạn, bạn không thể lưu khóa cùng với người quản lý hoặc nhân viên. Công đoàn của bạn chỉ chứa một khóa, người quản lý hoặc nhân viên
+1 Quan sát về việc sử dụng khóa 'union' là tuyệt vời! Bạn có thể muốn đề cập rằng không cần phải cung cấp các thẻ 'struct' cho' worker' và 'manager' bên trong' union'. – dasblinkenlight
Ah, bây giờ tôi nhận ra những gì tôi đã làm ở đó ... Tôi hoàn toàn bỏ lỡ quan điểm của việc sử dụng một công đoàn. – amiregelz