Псевдоним переменной структуры

Я пытаюсь создать псевдоним для переменной внутри структуры, как это:

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
};
Другие вопросы по тегам