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