在c中将值存储在union中

如果我们有一个带有三个变量int i的联合,char c,float f; 我们现在在变量c中存储一个值。 并且我们忘记了在一段时间之后,当前持有一个值的union的变量是什么。 因为这是由语言提供的任何机制,我们可以使用它来确定它是i还是c或f当前持有一个值。

这不可能。 联合的不同成员都指向相同的内存地址,它们只是看到内存的不同方式 。 修改联盟成员会修改所有其他成员。 你无法区分彼此。

那么,工会的关键是他们所有人都会拥有一个价值。 但是,如果您提取的类型与您输入的类型不同,那么您阅读的值可能没有意义。

如果您打算提取相同的类型,则必须跟踪自己输入的类型。 没有语言function可以跟踪您的情况。

#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 ++并“正确”地执行它,因为该语言具有此类function。 我的C ++不是很好,也许一些大师可以用C ++的方式展示如何做类似的解决方案。

在C ++ / Qt / COM / DCOM中有一个“变体”的概念,它粗略地说是一个联合体,它也存储了如何访问联合。 在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击败了我一秒钟。 请注意,我没有编译它,所以我的代码可能包含拼写错误。

没有。

C是一种较低级的语言。 它允许你写任何你想要的原始内存。 最后,无论是包含文本,整数还是代码,所有内存都包含位。 没有真正的方法来确定这些位代表什么。

虽然所有工会成员都“持有价值”,但没有机制来确定它最初的数据类型。

如果您需要知道这一点,那么您应该存储一个指示数据类型的标志,或者您不应该使用union。

如果你忘了就可以了,因为那将会写在代码上,你可以阅读它来找出答案。