C11 анонимный структурирует через typedefs? - PullRequest
15 голосов
/ 04 февраля 2012

Анонимные структуры были добавлены в стандарт C11, поэтому

typedef struct { 
    struct {int a, b};
    int c; 
} abc_struct;

является действительным и стандартным.Это также в рамках стандарта использовать typedef вместо полного объявления структуры?Например:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;

В документации GCC говорится, что это расширение Plan 9, но тогда оно работает в нескольких компиляторах, которые я пробовал (включая GCC ...).Из-за того, что я прочитал сам стандарт, я думаю, что все в порядке, но это тот тип внимательного прочтения, который легко испортить.

Ответы [ 3 ]

10 голосов
/ 04 февраля 2012

Это, очевидно, было задано в вопросе комитету С Джозефом С. Майерсом из команды gcc. И ответ - нет, он недействителен в C11.

Смотрите ответ здесь:

http://www.open -std.org / ОТК1 / SC22 / WG14 / WWW / Docs / n1549.pdf

И комментарий Майерса:

На этой неделе в Лондоне на совещании WG14 было решено запретить использование typedef для объявления анонимной структуры и полей объединения согласно N1549.

источник http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

Вопрос был задан в SC22WG15.12205, см. 5.28 SC22WG14.12205, Анонимные структуры (N1425) в http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1490.pdf

4 голосов
/ 04 февраля 2012

На самом деле ваш второй фрагмент чреват опасностью и не эквивалентен первому без явного указания -fplan9-extensions в gcc.

В частности, ab_struct;объявление в строке 6 НИЧЕГО не делает (согласно предупреждению gcc).Просто вставив второй фрагмент в foo.c, вы получите:

foo.c:6: warning: declaration does not declare anything

И особенно если вы попытаетесь:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}

, вы получите синтаксическую ошибку в строке 13 abc.a = 5;без -fplan9-extensio.

, тогда как при использовании верхнего фрагмента ваша анонимная структура будет работать так, как вы думаете.А именно:

typedef struct { 
    struct { 
            int a, b;
    };
        int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}
0 голосов
/ 04 февраля 2012

Ну, боюсь, я еще не удосужился получить готовый стандарт, но вот что говорит окончательный вариант:

  • Безымянный член, спецификатор типа которого является структурным спецификатором без тега, называется анонимной структурой; неназванный член, спецификатор типа которого является спецификатором объединения без тега, называется анонимным объединением.

Я могу интерпретировать только как то, что только struct {}; и union {}; могут быть анонимной структурой / объединением.

...