2012-11-28 40 views
0

有了这个联盟和stucts:我可以检查是否设置了联盟成员?

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

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

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

0

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

2

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

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