Почему обозначенные инициализаторы не реализованы в g ++ - PullRequest
13 голосов
/ 04 февраля 2011

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

Ответы [ 7 ]

12 голосов
/ 22 июля 2016

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

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};
9 голосов
/ 30 января 2012

Как я заметил в комментарии, 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 и C ++ (нет особой причины, почему C ++ не поддерживает синтаксис C99, они просто не учли его) и политикой GCC ( C ++ не должен поддерживать синтаксис C99 только потому, что он находится в C99, но он должен поддерживать синтаксис расширения GNU, который достигает точно такого же результата, потому что это расширение GNU, которое может применяться к любому языку)

9 голосов
/ 04 февраля 2011

C ++ не поддерживает это.Это даже не будет соответствовать стандартам C ++ 0x: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1

Кроме того, почему вы пытаетесь скомпилировать ядро ​​Linux с помощью G ++?

1 голос
/ 07 октября 2016

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

0 голосов
/ 30 марта 2019
0 голосов
/ 04 декабря 2017

А как насчет анонимных союзов?

В 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 ++ даже с c ++ 14 это выдает такую ​​же ошибку «извините, не реализованную». Нам нужно иметь возможность определять переменные C в C ++, когда мы хотя бы хотим модульно протестировать код C с помощью инфраструктуры тестирования C ++. Тот факт, что такая ценная функция от C не поддерживается, является позором.

0 голосов
/ 04 февраля 2011

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

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

...