Создание вложенных структур без -fms-расширений?

У меня есть структура с некоторыми свойствами:

struct a {
    char* id;
    int a;
    int b;
    int c;
}

У меня также есть структура с теми же свойствами, но без id.

struct b {
    int a;
    int b;
    int c;
}

Я знаю, что C11 поддерживает анонимные структуры, поэтому я мог бы сделать что-то вроде этого:

struct a {
    char* id;
    struct {
        int a;
        int b;
        int c;
    }
}

Однако, если я дам внутренней структуре тег, произойдет сбой. Можно ли создавать подобные вложенные структуры без использования нестандартной опции компилятора, такой как -fms-extensions?


person Alexis King    schedule 01.01.2013    source источник
comment
Пока C11 не станет обычным явлением, тогда нет, вы всегда будете полагаться на расширения, специфичные для компилятора.   -  person Oliver Charlesworth    schedule 01.01.2013
comment
Параметры компилятора не являются стандартными, как бы вы это ни делали, я бы использовал флаги, необходимые для правильной реализации компилятором C11.   -  person u0b34a0f6ae    schedule 06.02.2013


Ответы (1)


Вы можете дать внутренней структуре имя или тег, или и то, и другое в C11 (т. е. без использования какого-либо расширения).

Без тега и без имени ваша внутренняя структура является анонимной структурой C11:

struct a {
    char* id;
    struct {
        int a;
        int b;
        int c;
    };
 };

Если вы дадите внутренней анонимной структуре имя, она перестанет быть анонимной структурой. Это обычный элемент структуры C89/C99/C11, и вы не можете получить прямой доступ к элементам внутренней структуры, как в случае с анонимными структурами.

Если вы дадите внутренней анонимной структуре тег (но все еще без имени), это просто объявление структуры C89/C99/C11. Член не добавлен, и объявление struct a такое же, как:

struct a {
    char* id;
};
person ouah    schedule 01.01.2013
comment
Действительно? Потому что, если я делаю struct a { struct b { int a; }; };, а затем a.a, я получаю сообщение об ошибке, что в структуре a нет члена с именем 'a'. Это проблема поддержки компилятора? Или это запрещено в C11? - person Alexis King; 01.01.2013
comment
@JakeKing смотрите мое редактирование, это больше не анонимная структура, поэтому это не разрешено. - person ouah; 01.01.2013
comment
@JakeKing в определении C анонимная структура - это внутренняя структура без тега и без имени. - person ouah; 01.01.2013
comment
А, хорошо, понял. Я немного не понимаю, почему это не поддерживается, но я понимаю, что это выходит за рамки этого вопроса. Однако я действительно не хочу косвенно ссылаться на члены внутренней структуры, поэтому я все равно предпочел бы дублировать члены. Я так понимаю, что выхода нет? - person Alexis King; 01.01.2013
comment
Не переносимо, насколько мне известно. Но если вы в любом случае не хотите косвенно обращаться к членам внутренней структуры, зачем нужно называть структуру? - person ouah; 01.01.2013
comment
Я предполагаю, что моя терминология неверна. Я хочу пометить его, а не назвать. - person Alexis King; 01.01.2013
comment
@JakeKing, если вы только пометите его, он больше не является анонимной структурой, но также не является членом внешней структуры. Это просто бесполезная декларация. - person ouah; 01.01.2013