假设我们有一个联盟:
typedef union someunion {
int a;
double b;
} myunion;
Run Code Online (Sandbox Code Playgroud)
在设置例如a = 123之后,是否可以检查哪种类型是联合的?我的方法是将这个联合添加到某个结构中,并在它为int时将uniontype设置为1,当它为double时将其设置为2.
typedef struct somestruct {
int uniontype
myunion numbers;
} mystruct;
Run Code Online (Sandbox Code Playgroud)
有没有更好的解决方案?
das*_*ght 20
有没有更好的解决方案?
不,您展示的解决方案是最好的(也是唯一的)解决方案.union
s非常简单 - 它们不会"跟踪"你分配给你的东西.他们所做的就是让你为所有成员重用相同的内存范围.它们不提供除此之外的任何其他内容,因此将它们封装在一个struct
并使用"类型"字段进行跟踪正是要做的事情.
C不会自动跟踪当前正在使用的联合中的哪个字段.(事实上,我认为从"错误"字段读取会导致实现定义的行为.)因此,您的代码需要跟踪当前使用/填写的行为.
保持单独的'uniontype'变量的方法是一种非常常见的方法,应该可以正常工作.
无法直接查询当前存储在union
.
了解 a 中存储的类型的唯一方法union
是具有显式标志(如您的mystruct
示例中所示),或者确保当联合具有已知的活动元素时控制仅流向代码的某些部分。