2016-10-26 2 views
5

Предположим, у меня есть союз u с двумя членами a и b того же типа (например, int).Члены союза того же типа

union u{ 
    int a,b; 
    char c; 
}; 

Если я пишу a, передать его в функцию по значению, а функция считывает из b, ожидая, чтобы получить значение a, будет ли какие-либо вопросы, учитывая a и b имеют одинаковый тип? Нужно ли чтению членов, чтобы точно записывать записи члена?

+3

C11 draft N1548 может сказать, что проблем не возникнет. Я не могу точно сказать. Все еще чтение. Сноска: «95) Если элемент, используемый для чтения содержимого объекта объединения, не совпадает с элементом, который последний раз использовался для , сохраните значение в объекте, соответствующая часть представления объекта значения будет переинтерпретирована as представление объекта в новом типе, как описано в 6.2.6 (процесс, иногда называемый «тип punning»). Это может быть ловушка. – Ryan

ответ

4

Да, это нормально.

Стандарт (C11 проект) говорит:

[...] если объединение содержит несколько структур, которые разделяют общую начальную последовательности (см ниже), и если в данный момент объект союза содержит один из эти структуры, разрешается осматривать общую начальную часть любого из них в любом месте, что декларация завершенного типа союза является видна

Здесь два целых числа можно считать (очень сим) структур, которые имеют одну и ту же начальную последовательность.

Даже без учета того, есть также:

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

переосмысления int как int довольно безопасно. :)