【问题标题】:How to determine what type is used in a union?如何确定联合中使用什么类型?
【发布时间】:2012-03-17 18:37:50
【问题描述】:

如果有几种可能的选择,是否可以确定联合包含的类型?

typedef union
{
    char     charArr[SIZE];
    int      intVal;
    float    floatVal;
} VALUE_TYPE;

VALUE_TYPE number;
number.intVal = 8;

如果值是从其他地方设置的,如何知道联合在这里包含什么?

【问题讨论】:

    标签: c types unions


    【解决方案1】:

    您不能开箱即用地做这种事情是正确的。

    解决此问题的常用方法是您可以在联合中添加类型。例如,它可能是:

    enum { charArr_type, float_type, int_type } VALUE_TYPE;
    typedef union
    {
        char     charArr[SIZE];
        int      intVal;
        float    floatVal;
    } VALUE;
    struct my_value { 
       VALUE val,
       VALUE_TYPE val_type
    }
    

    之后,您只需在分配结构时更新类型:

    my_value number;
    number.val.intVal = 8;
    number.val.val_type = is_int
    

    当您需要一个能够存储几乎任何东西的通用类型时,这是一种常见的现代模式。

    例如,您可以在 PHP 源代码中的任何地方找到它。这就是它们在同一个对象中存储不同值类型的方式。详情请参阅this page

    【讨论】:

    • 是的,但如果他试图节省内存,这将需要为每个VALUE 存储一个额外的enum(整数?)。此外,您不能强制用户存储一致的值,即可以轻松编写 my_value.val=10; my_value.val_type = is_charArr;
    • @vulkanino 您可以制作一个包装器来正确设置和获取此结构。在 PHP 中,他们使用大量宏来保护他们的 store-everything 结构,并将类型存储在 uchar 中。
    【解决方案2】:

    使用联合,您可以跟踪放入其中的任何类型,并确保在正确的时间检索正确的类型。

    不要使用联合。您真的有需要节省空间的内存问题吗?

    【讨论】:

      【解决方案3】:

      不,你不能说,语言没有这种能力。

      如果您需要这些信息,您必须自己跟踪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-09
        • 2011-05-18
        • 2011-03-31
        • 2021-12-12
        • 2017-03-29
        • 1970-01-01
        相关资源
        最近更新 更多