如果我们有三个变量int i的联合,char c,float f;我们现在在变量c中存储一个值。并且我们忘记了在一段时间之后,当前拥有值的联合变量是什么。因为这是语言提供的任何机制,我们可以使用它来确定它是i还是c或f当前是否有值。
答案 0 :(得分:3)
好吧,联盟的重点是所有都会保存一个值。但是,如果你提取的类型不同于你输入的类型,那么你读取的值可能没有意义。
如果您打算提取相同的类型,则必须跟踪自己输入的类型。没有语言功能可以跟踪您的情况。
答案 1 :(得分:3)
这是不可能的。联合的不同成员都指向相同的内存地址,它们只是不同的方式来查看该内存。修改联盟成员会修改所有其他成员。你无法区分彼此。
答案 2 :(得分:3)
#define VARIANT_FLOAT_TYPE 1
#define VARIANT_DOUBLE_TYPE 2
// and so on
struct variant_wb {
union {
float f;
double d;
int i;
char c;
};
int stored_type;
};
然后你可以像这样使用它:
struct variant_wb var;
var.f = 1.23;
var.stored_type = VARIANT_FLOAT_TYPE;
你也可以使用无数函数来处理这个struct / union,或者你可以学习C ++并“正确”地执行它,因为该语言具有这种类型的特性。我的C ++不是很好,也许一些大师可以用C ++方式展示如何做类似的解决方案。
答案 3 :(得分:2)
在C ++ / Qt / COM / DCOM中有一个“Variant”的概念,它粗略地说是一个联合体,它也存储了如何访问联合。 在C中,你必须提供这样的东西:
struct myCVariant
{
int variantType;
union
{
char v1;
int v2;
float v3;
} variantContent;
void initVariant()
{
variantType = 0;
}
void setChar(char a)
{
variantType = 1;
variantContent.v1 = a;
}
void setInt(int a)
{
variantType = 2;
variantContent.v2 = a;
}
// ... and so on
bool getChar(char* pa)
{
if (variantType == 1)
{
*pa = variantContent.v1;
return true;
}
return false; // Error reading a char where something else was stored
}
// ... and so on
};
您可以在某些C ++源代码中复制一些Variant实现并将其移植到C.它不完全相同,但它类似。它有些类型安全(至少在运行时)。
编辑:hexa击败了我一秒钟。请注意,我没有编译它,所以我的代码可能包含拼写错误。答案 4 :(得分:1)
没有
C是一种低级语言。它允许你写任何你想要的原始内存。最后,无论是包含文本,整数还是代码,所有内存都包含位。没有真正的方法来确定这些位代表什么。
虽然所有工会成员都“持有价值”,但没有机制来确定它最初的数据类型。
如果您需要知道这一点,那么您应该存储一个指示数据类型的标志,或者您不应该使用联合。
答案 5 :(得分:1)
如果你忘记了就可以了,因为它会直接写在代码上,你可以阅读它来查找。