2013-09-18 2 views
1

Я прочел эту ссылку what-is-the-point-behind-unions-in-c Но этот ответ мне не подходит.Что такое использование union в c?

Могу ли я получить больше объяснений относительно использования профсоюзов. Мне не нужны примеры с памятью, например, это займет не более 4 байт (поплавок занимает 4 байта).

union un{ 
    char ch; 
    int iNum; 
    float fNum; 
}; 

Так что мой вопрос,

, что именно использование союза?

Для чего это необходимо?

Пожалуйста, помогите мне, это меня смущает. Спасибо.

+3

Пожалуйста, найдите перед отправкой вопросов ... – RedX

+0

В принятом ответе упоминается _variant datatype_. В чем его недостаточно? Пример? Структура данных стека. – mouviciel

+0

@Dayalrai ... большое спасибо! – user2322888

ответ

3

Вероятно, наиболее часто используются два для объединения являются:

  • Чтобы реализовать свой собственный Variant type, union дает возможность представлять все различные типы без потери памяти. This answer - хороший пример.

  • Type punning но я читал Understanding Strict Aliasing, а так как есть много случаев, когда type punning является undefined behavior. Хотя на практике большинство компиляторов поддерживают тип punning через объединение.

1

Это хорошо, если у вас есть переменная, которая может быть либоchar, илиint, или ...

Он часто используется в структурах, которые содержат фактический тип союза. Часто используется парсерами для возврата токена из лексера. Нечто подобное:

struct token 
{ 
    int token_type; 

    union 
    { 
     char *s; /* For string or keyword tokens */ 
     double f; /* For floating point tokens */ 
     long i; /* For integer tokens */ 
    } token_value; 
}; 

В приведенной выше структуре, используемый элемент в token_value элементе зависит от token_type члена.


Профсоюзы также могут быть использованы злоупотребляя данные в союзе, где вы установили один элемент переменной и прочитать другую. Например, это можно использовать для преобразования числа с плавающей точкой в ​​ряд байтов.

Как

union data 
{ 
    char data[sizeof(double)]; 
    double value; 
}; 

Установив value элемент, вы можете прочитать отдельные байты значения double без типажей или арифметики указателей. Это технически реализуемое поведение, что означает, что компилятор может его не допускать. Это очень часто используется, поэтому все современные компиляторы позволяют это делать.

+2

Сноска C99TC3 82 дает понять, что тип-punning через объединение относится к категории *, определенной при реализации *, а не к категории * undefined behavior *. –

+0

@PascalCuoq Ах, ладно. Перефразировал мой ответ за это. –

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