【发布时间】:2013-12-01 11:24:06
【问题描述】:
我有以下代码:
struct sched_param {
union {
int sched_priority;
struct rcost_sched_param rcost_params;
};
};
我想知道这两个参数中的哪一个是“活动的”。除了在struct sched_param 中添加一个 int 之外,我还有其他方法吗?
【问题讨论】:
我有以下代码:
struct sched_param {
union {
int sched_priority;
struct rcost_sched_param rcost_params;
};
};
我想知道这两个参数中的哪一个是“活动的”。除了在struct sched_param 中添加一个 int 之外,我还有其他方法吗?
【问题讨论】:
struct sched_param {
int type;
union {
int sched_priority;
struct rcost_sched_param rcost_params;
};
}
您可以添加名为type的成员,保存参数为“活动”的数据
【讨论】:
不,这是棘手的部分:您必须存储要使用的联合条目的信息(例如,使用单个 char 成员)。另请注意,两个联合条目可能不一定指向相同的位置(如您所料,例如由于打包或字节序),因此您不能只读取一个值并确定它是否包含有效值,因为它是由编译器如何在幕后实现联合中的结构。
【讨论】:
union 的实现方式与编译器无关:它们用不同的类型覆盖同一个对象。所有union 成员当然总是有相同的地址。这就是 unions 的用途。
unions 真的不取决于编译器。有一个严格的规则:联合类型描述了一组重叠的非空成员对象,每个成员对象都有一个可选的指定名称和可能不同的类型。