作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已经学会了,但并没有真正得到 union 。我阅读的每一篇 C 或 C++ 文本都介绍了它们(有时是顺便介绍的),但它们往往很少给出使用它们的原因或位置的实际示例。在现代(甚至是传统)案例中, union 什么时候有用?我唯一的两个猜测是,当您的工作空间非常有限时,或者当您正在开发 API(或类似的东西)并且您想强制最终用户在一度。这两个猜测是否接近正确?
最佳答案
union 通常与鉴别器一起使用:一个变量,指示 union 的哪些字段是有效的。例如,假设您要创建自己的 Variant类型:
struct my_variant_t {
int type;
union {
char char_value;
short short_value;
int int_value;
long long_value;
float float_value;
double double_value;
void* ptr_value;
};
};
然后你会这样使用它:
/* construct a new float variant instance */
void init_float(struct my_variant_t* v, float initial_value) {
v->type = VAR_FLOAT;
v->float_value = initial_value;
}
/* Increments the value of the variant by the given int */
void inc_variant_by_int(struct my_variant_t* v, int n) {
switch (v->type) {
case VAR_FLOAT:
v->float_value += n;
break;
case VAR_INT:
v->int_value += n;
break;
...
}
}
这实际上是一个很常见的习语,特别是在 Visual Basic 内部。
有关真实示例,请参阅 SDL 的 SDL_Event union . (actual source code here)。 union 顶部有一个 type
字段,每个 SDL_*Event 结构都重复相同的字段。然后,要处理正确的事件,您需要检查 type
字段的值。
好处很简单:只有一种数据类型可以处理所有事件类型,而无需使用不必要的内存。
关于c++ - 什么时候有人会使用 union ?它是C-only时代的残余吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4788965/
我正在为我的许多项目移除 Python 2 支持,我想移除多年来积累的 Python 2 垃圾。例如,我说的是 # -*- coding: utf-8 -*- headers,object规范 cla
我是一名优秀的程序员,十分优秀!