2

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

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);


}

提前致谢。

4

3 回答 3

6

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

struct val {
  enum { EMP_INT, EMP_FLOAT } tag;
  union emp {
    int i;
    float f;
  } emp;
};
于 2012-04-09T12:38:19.470 回答
1

并非如此,取决于您访问内存的字段将被解释为 afloat或 an int

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

于 2012-04-09T12:39:09.893 回答
1

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

您可以执行以下操作:

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

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

您可以使用布尔值来代替枚举,例如isFloat.

于 2012-04-09T12:41:34.990 回答