Вещи могут быть немного яснее, если мы немного переформатируем код:
struct st { int a; } fn()
{
struct st obj;
obj.a = 10;
return obj;
}
int main()
{
struct st obj = fn();
printf("%d\n", obj.a);
return 0;
}
Таким образом, тип возврата fn()
равен struct st {int a;}
. После определения структуры нет точки с запятой, поскольку тип структуры является частью определения функции (проследите по грамматике от translation-unit
-> top-level-declaration
-> function-definition
). Тип структуры доступен для main()
, потому что вы поместили тег структуры в него (st). Вы написали
struct { int a; } fn() {...}
тогда тип не был бы доступен для main()
; вам бы пришлось создать новый тип структуры с таким же определением.
Вы получаете такой же эффект, как если бы вы написали
struct st {
int a;
};
struct st fn()
{
/* same as before */
}
int main()
{
/* same as before */
}