我可以检查是否设置了Union-Member?

时间:2012-11-28 12:46:03

标签: c unions

拥有这个联盟并且结果:

tydef union{
  TYPE1 t1;
  TYPE2 t2;
  TYPE3 t3;
}myunion;

typedef struct{
   uint8 ID;
   uint8 value;
}TYPE1;

typedef struct{
   uint8 ID;
   uint8 flag;
   long value;
}TYPE2;

我想执行这样的函数:

CheckIfSet(&myunion.t1);

有点像这样:

CheckIfSet(void *test){
  if (test.ID != NULL) then{
   return TRUE;
  }
  return FALSE;
}

在执行此检查之前,我正在执行另一个函数,这将导致myunion.t1的设置 - 但我需要检查它是否确实发生。

3 个答案:

答案 0 :(得分:4)

没有。您必须跟踪联合的哪个字段处于活动状态。联合的后备内存在其字段中共享,因此设置一个可能会影响另一个的值。

另外,不要忘记访问联合的非活动字段会导致未定义的行为。

答案 1 :(得分:2)

不,你不能这样做。没有用纯C语言“设定”的东西。即使您尚未初始化变量,它也包含一些垃圾值,该值属于该变量类型的所有可能值的集合。您无法区分这是有效值还是垃圾值。

您需要引入某种用于检查初始化状态的标志。例如,该标志最初可以初始化为FALSE,一旦您设置了联合,它将被更改为TRUE

答案 2 :(得分:0)

将ID的值初始化为您不使用的值并对其进行测试。