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

C11 анонимные структуры через typedefs?

Анонимные структуры добавлены в стандарт 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...). Своим чтением самого стандарта, Я думаю, что все в порядке, но это вроде тесное чтение, которое легко испортить.

4b9b3361

Ответ 1

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

См. ответ здесь:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

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

На этой неделе лондонская встреча WG14 согласилась запретить использование typedefs при объявлении анонимной структуры и полей объединения в соответствии с 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

Ответ 2

На самом деле ваш второй фрагмент чреват опасностью и не эквивалентен первому без явного указания -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;
}

Ответ 3

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

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

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