Поскольку код, которым вы поделились, не включает поле тега, указывающее, действительно ли используется элемент A
или B
, нет никакого конкретного способа точно узнать, какой из них был предназначен для какого-либо конкретного экземпляра.
Однако, в зависимости от данных, которые вы получаете, вы можете сделать обоснованное предположение в своем коде. Например, скажем, у меня есть следующее объединение в системе, которая использует IEEE 754 для типов с плавающей запятой:
typedef union _F_or_I
{
float f;
int32_t i;
uint32_t bits;
} F_or_I;
Если первые 9 бит (знак и показатель степени) равны 0, это, вероятно, не число с плавающей запятой:
F_or_I foo = /* some value */;
if(!(foo.bits & 0xFF800000))
{
// access member 'i'
}
else
{
// access member 'f'
}
Конечно, этот способ не всегда точен в зависимости от того, какой именно тип (ы) вы используете в объединении (я бы даже не использовал его для типов, использованных в моем примере!), И от правильного способа Для этого нужно включить в родительский элемент struct
элемент тега, который указывает, к какому члену объединения предполагается получить доступ.