如何确定联合中使用的类型?

时间:2012-02-28 09:31:07

标签: c types unions

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

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

VALUE_TYPE number;
number.intVal = 8;

如果值是从其他地方设置的,如何知道联合包含的内容?

3 个答案:

答案 0 :(得分:5)

你不能开箱即用这种东西是对的。

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

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

答案 1 :(得分:1)

不,你不能说,语言没有这方面的便利。

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

答案 2 :(得分:0)

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

不要使用工会。你真的有这样的内存问题需要你节省空间吗?