Псевдоним переменной структуры
Я пытаюсь создать псевдоним для переменной внутри структуры, как это:
typedef struct {
union {
Vector2 position;
float x, y;
};
union {
Vector2 size;
float width, height;
};
} RectangleF;
(обратите внимание, что я не назвал союзы, поэтому мне не нужно писать: 'variable.unionname.x' и т. д.)
однако я получаю предупреждение "Инициализатор переопределяет предшествующую инициализацию этого подобъекта", когда я создаю некоторые константы этой структуры:
static const RectangleF RectangleFZero = {
.x = 0.0f,
.y = 0.0f, // warning
.width = 0.0f,
.height = 0.0f // warning
}
что-то не так делает? и если нет, как я могу избавиться от этого предупреждения?
Изменить: Решение, которое я использую сейчас:
typedef struct {
union {
Vector2 position;
struct { float x, y; };
};
union {
Vector2 size;
struct { float width, height; };
};
} RectangleF;
1 ответ
Решение
Проблема в том, что ваш союз на самом деле таков:
typedef struct {
union {
Vector2 position;
float x;
float y;
};
union {
Vector2 size;
float width;
float height;
};
} RectangleF;
Вы можете исправить это, выполнив:
typedef struct {
union {
Vector2 position;
struct {
float x;
float y;
} position_;
};
union {
Vector2 size;
struct {
float width;
float height;
} size_;
};
} RectangleF;
А затем сделайте:
static const RectangleF RectangleFZero = {
.position_.x = 0.0f,
.position_.y = 0.0f,
.size_.width = 0.0f,
.size_.height = 0.0f
};
Дополнительно...
Если ваш компилятор поддерживает анонимные внутренние структуры C 2011, то вы также можете сделать это:
typedef struct {
union {
Vector2 position;
struct {
float x;
float y;
};
};
union {
Vector2 size;
struct {
float width;
float height;
};
};
} RectangleF;
static const RectangleF RectangleFZero = {
.x = 0.0f,
.y = 0.0f,
.width = 0.0f,
.height = 0.0f
};