c++ 什么时候使用联合?它是残余的C只有几天吗?

我学到了,但不是真正得到工会。每一个C或C文本,我经历介绍(有时在传递),但他们往往只给出很少的实例,为什么或在哪里使用它们。什么时候工会在现代(甚至是遗产)案件中是有用的?我只有两个猜测是编程微处理器,当你有非常有限的空间使用,或当你开发一个API(或类似的东西),你想强制终端用户只有几个对象/类型的一个实例一次。这两个猜测是否接近正确?
最佳答案
联合通常与一个鉴别器的公司一起使用:一个变量,指示联合的哪些字段是有效的。例如,假设您想创建自己的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)。在联合的顶部有一个类型字段,并且在每个SDL_ * Event结构上重复相同的字段。然后,要处理正确的事件,您需要检查类型字段的值。

好处是简单的:有一个单一的数据类型来处理所有事件类型,而不使用不必要的内存。

转载注明原文:c++ 什么时候使用联合?它是残余的C只有几天吗? - 代码日志