如何检查联合中当前使用的类型?

tom*_*ies 29 c unions

假设我们有一个联盟:

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

有没有更好的解决方案?

不,您展示的解决方案是最好的(也是唯一的)解决方案.unions非常简单 - 它们不会"跟踪"你分配给你的东西.他们所做的就是让你为所有成员重用相同的内存范围.它们不提供除此之外的任何其他内容,因此将它们封装在一个struct并使用"类型"字段进行跟踪正是要做的事情.

  • 仅供参考,这种技术被称为"标记联盟". (11认同)
  • 更好的解决方案是使用枚举值而不是1,2等. (5认同)

Eri*_* Pi 6

C不会自动跟踪当前正在使用的联合中的哪个字段.(事实上​​,我认为从"错误"字段读取会导致实现定义的行为.)因此,您的代码需要跟踪当前使用/填写的行为.

保持单独的'uniontype'变量的方法是一种非常常见的方法,应该可以正常工作.


Man*_*rse 5

无法直接查询当前存储在union.

了解 a 中存储的类型的唯一方法union是具有显式标志(如您的mystruct示例中所示),或者确保当联合具有已知的活动元素时控制仅流向代码的某些部分。