Доступ к одному и тому же члену различных структур

Отказ от ответственности: следующее пытается максимально упростить проблему. Первоначально переменная 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 на том же месте в исходной последовательности полей в обоих structs:

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 не доступно во время выполнения. Также у вас нет данных внутри структур, которые указывают, к какому типу относится данный экземпляр (т. Е. Это не "теговое объединение").

Другие вопросы по тегам