拥有这个联盟并且结果:
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的设置 - 但我需要检查它是否确实发生。
答案 0 :(得分:4)
没有。您必须跟踪联合的哪个字段处于活动状态。联合的后备内存在其字段中共享,因此设置一个可能会影响另一个的值。
另外,不要忘记访问联合的非活动字段会导致未定义的行为。
答案 1 :(得分:2)
不,你不能这样做。没有用纯C
语言“设定”的东西。即使您尚未初始化变量,它也包含一些垃圾值,该值属于该变量类型的所有可能值的集合。您无法区分这是有效值还是垃圾值。
您需要引入某种用于检查初始化状态的标志。例如,该标志最初可以初始化为FALSE
,一旦您设置了联合,它将被更改为TRUE
。
答案 2 :(得分:0)
将ID的值初始化为您不使用的值并对其进行测试。