Доступ к одному и тому же члену различных структур
Отказ от ответственности: следующее пытается максимально упростить проблему. Первоначально переменная int x
это структура, но я бы подумал, что это не важно здесь.
Предположим, у нас есть две структуры в союзе (я не имею никакого влияния на это)
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_ {
float also_irrelevant;
int x;
} b_;
typedef union uni_t{
a_ a;
b_ b;
} uni;
Возможно ли получить доступ x
в обеих структурах одним и тем же утверждением, как ptr_to_struct->x
? Но afaik указатель нуждается в правильном типе во время компиляции. Таким образом, объявление зависимости, похожее на этот псевдокод
if (union contains a_)
{
a_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.a);
}
else
{
b_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.b);
}
Насколько я знаю, это невозможно.
Есть ли возможность получить "общий" доступ к переменной x
независим от текущего состояния союза?
2 ответа
Вы правы, это невозможно. Тип ptr_to_struct
здесь вторичная проблема Основная проблема заключается в том, что адрес x
внутри uni
изменения на основе которых struct
"активен" внутри union
:
- Если
a_
является "активным", смещениеx
с вершиныunion
ноль - Если
b_
является "активным", смещениеx
с вершиныunion
являетсяsizeof(float)
плюс возможное дополнительное смещение для выравнивания поля
Одним из решений этой проблемы было бы поставить x
на том же месте в исходной последовательности полей в обоих struct
s:
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_t {
int x; // Moved to the top
float also_irrelevant;
} b_;
Теперь, когда x
занимает ту же позицию, C дает гарантию, что адрес x
в союзе будет то же самое, если вы получите доступ к нему через a.x
или через b.x
,
Это невозможно. C не имеет отражения, поэтому "имя" x не доступно во время выполнения. Также у вас нет данных внутри структур, которые указывают, к какому типу относится данный экземпляр (т. Е. Это не "теговое объединение").