0

拥有这个工会和结构:

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 的设置 - 但我需要检查它是否确实发生了。

4

3 回答 3

4

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

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

于 2012-11-28T12:48:40.733 回答
2

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

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

于 2012-11-28T12:50:54.507 回答
0

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

于 2012-11-28T12:49:05.937 回答