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