联合经常在结构中使用,因为结构可以有一个成员来跟踪哪个联合成员存储一个值。
例如,在以下程序中,车辆结构使用车辆识别号(VIN)或指定的id,但不能同时使用这两者:
typedef struct { char make[20]; int model_year; int id_type; /* 0 为 id_num, 1 为 VIN */ union { int id_num; char VIN[20]; } id; } vehicle; vehicle car1; strcpy(car1.make, "Ford"); car1.model_year = 2017; car1.id_type = 0; car1.id.id_num = 123098;
请注意,联合声明在结构内部。执行此操作时,声明结尾处需要联合名称。
具有union标记的union可以在结构外部声明,但是有了这样的特定用途,结构内的union可以更容易地理解代码。
另请注意,点运算符用于访问结构成员的联合成员两次。
id_类型跟踪哪个联合成员存储值。以下语句显示car1数据,使用id_类型确定要读取哪个联合成员:
/* 显示车辆数据 */ printf("品牌: %s\n", car1.make); printf("车型年份: %d\n", car1.model_year); if (car1.id_type == 0) printf("ID: %d\n", car1.id.id_num); else printf("ID: %s\n", car1.id.VIN);
联合也可以包含结构。