联合经常在结构中使用,因为结构可以有一个成员来跟踪哪个联合成员存储一个值。
例如,在以下程序中,车辆结构使用车辆识别号(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);
联合也可以包含结构。