如何在运行时区分c中的union成员

时间:2012-04-09 12:35:52

标签: c unions

我对工会有疑问。假设有一个定义为

的联合
union emp{
    float f;
    int i;
};

有没有办法确定使用哪个联合字段。我遇到过一种情况,我必须在使用float字段时打印float,如果使用int字段则打印int。函数可能类似于

void print(union u){

    // if float field is initialized
    printf("float field = %f\n",u.f);

    // if int field is initialized
    printf("int field = %d\n",u.i);


}

提前致谢。

3 个答案:

答案 0 :(得分:6)

你不能只用union来判断;通常将其包装在struct中,其中包含某种标记值。

struct val {
  enum { EMP_INT, EMP_FLOAT } tag;
  union emp {
    int i;
    float f;
  } emp;
};

答案 1 :(得分:1)

实际上,根据您访问内存的字段,将被解释为floatint

您最好的选择是将union作为结构的一部分,并保留一个标志,指示使用哪个字段。

答案 2 :(得分:1)

您不能,信息不会存储在运行时的任何地方。

您可以执行以下操作:

struct emp {
        enum storedValue type;
        union {
                float f;
                int   i;
        }
};

手动存储类型。然后,枚举的值为floatvalintval或类似。

您可以使用类似isFloat的布尔值来代替枚举。