【发布时间】:2012-03-17 18:37:50
【问题描述】:
如果有几种可能的选择,是否可以确定联合包含的类型?
typedef union
{
char charArr[SIZE];
int intVal;
float floatVal;
} VALUE_TYPE;
VALUE_TYPE number;
number.intVal = 8;
如果值是从其他地方设置的,如何知道联合在这里包含什么?
【问题讨论】:
如果有几种可能的选择,是否可以确定联合包含的类型?
typedef union
{
char charArr[SIZE];
int intVal;
float floatVal;
} VALUE_TYPE;
VALUE_TYPE number;
number.intVal = 8;
如果值是从其他地方设置的,如何知道联合在这里包含什么?
【问题讨论】:
您不能开箱即用地做这种事情是正确的。
解决此问题的常用方法是您可以在联合中添加类型。例如,它可能是:
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; !
使用联合,您可以跟踪放入其中的任何类型,并确保在正确的时间检索正确的类型。
不要使用联合。您真的有需要节省空间的内存问题吗?
【讨论】:
不,你不能说,语言没有这种能力。
如果您需要这些信息,您必须自己跟踪。
【讨论】: