Подтвердить что ты не робот

Почему назначенные инициализаторы не реализованы в g++

Есть ли какая-либо конкретная причина, почему поддержка назначенных инициализаторов не была добавлена ​​в g++? Является ли причина того, что стандарты C99 запоздали, и g++ был разработан ранее, а позже людям это не волновало, или существует какая-то сложность в реализации назначенных инициализаторов в грамматике С++?

4b9b3361

Ответ 1

Как я заметил в комментарии, g++ не поддерживает стандартные назначенные инициализаторы C99, но поддерживает расширение GNU до C90, которое позволяет назначать инициализаторы. Так что это не работает:

union value_t {
    char * v_cp;
    float v_f;
};
union value_t my_val = { .v_f = 3.5f };

Но это делает:

union value_t my_val = { v_f: 3.5f };

Это, по-видимому, плохое взаимодействие координации между комитетами стандартов C и С++ (нет особо веской причины, почему С++ не поддерживает синтаксис C99, они просто не рассматривали его) и политики GCC ( С++ не должен поддерживать синтаксис C99 только потому, что он на C99, но он должен поддерживать синтаксис расширения GNU, который достигает точно такой же, потому что это расширение GNU, которое может быть применено к любому языку).

Ответ 2

Сегодня я столкнулся с этой проблемой. g++ с -std = С++ 11 и С++ 14 поддерживает назначенные инициализаторы, но вы все равно можете получить ошибку компиляции "test.cxx: 78: 9: sorry, unimplemented: нетривиальные назначенные инициализаторы не поддерживаются", если вы не инициализируйте структуру в том порядке, в котором они были определены. В качестве примера

struct x
{
    int a;
    int b;
};

// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};

Ответ 4

По крайней мере, g++ - 4.8 теперь поддерживается по умолчанию.

Ответ 5

Как насчет анонимных профсоюзов?

В C я могу иметь это:

struct vardir_entry {
    const uint16_t id;
    const uint8_t sub;
    const char *name;
    const uint8_t type;

    const union {   
        struct vardir_lookup lookup;
        struct vardir_min_max_conf minmax;       
    };

    const union {
        const struct vardir_value_target_const const_value;
        const struct vardir_value_target value;
    };
};

И инициализируется следующим образом:

static const struct vardir_entry _directory[]{
        { .id = 0xefef, .sub = 0, .name = "test", .type = VAR_UINT32, .minmax = { .min = 0, .max = 1000 }, .value = VARDIR_ENTRY_VALUE(struct obj, &obj, member) }
    };

Однако под g++ даже с С++ 14 это дает ту же ошибку "извините, не реализована". Нам нужно иметь возможность определять переменные C в С++, когда мы, по крайней мере, хотим использовать unit test C-код с С++ test framework. Тот факт, что такая ценная функция от C не поддерживается, - довольно стыдно.

Ответ 6

Согласование с http://gcc.gnu.org/c99status.html назначенные инициализаторы уже реализованы.

Какую версию g++ вы используете? (Попробуйте g++ - версия)