2012-04-09 2 views
2

У меня есть сомнения относительно профсоюзов. Предположим, что существует объединение, которое определено какКак различать членов профсоюза в c во время выполнения

union emp{ 
    float f; 
    int i; 
}; 

Есть ли способ определить, какое поле союза используется. Я сталкивался с ситуацией, в которой я должен напечатать поплавок, если поле с плавающей точкой используется и для печати INT, если INT поле used.The функция может быть как

void print(union u){ 

    // if float field is initialized 
    printf("float field = %f\n",u.f); 

    // if int field is initialized 
    printf("int field = %d\n",u.i); 


} 

Спасибо заранее.

ответ

6

Вы не можете сказать только с union; обычно вы переносите его в struct, который включает в себя значение тега.

struct val { 
    enum { EMP_INT, EMP_FLOAT } tag; 
    union emp { 
    int i; 
    float f; 
    } emp; 
}; 
1

Не очень, в зависимости от того, какое поле вы получаете доступ к памяти будет интерпретироваться либо как float или int.

Вам будет лучше всего сделать объединенную часть структуры, а также сохранить флаг, указывающий, какое поле используется.

1

Вы не можете, информация не хранится нигде во время выполнения.

Вы могли бы сделать что-то вроде:

struct emp { 
     enum storedValue type; 
     union { 
       float f; 
       int i; 
     } 
}; 

вручную сохранить тип. Затем перечисление имеет значения, такие как floatval и intval или аналогичные.

Вместо перечисления вы можете использовать boolean, например isFloat.

Смежные вопросы