Структура не может быть пустой в C, потому что синтаксис запрещает это. Кроме того, существует семантическое ограничение, которое делает поведение неопределенным, если структура не имеет именованного члена:
struct-or-union-specifier:
struct-or-union identifieropt { struct-declaration-list }
struct-or-union identifier
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration
struct-declaration:
specifier-qualifier-list struct-declarator-list ;
/* type-specifier or qualifier required here! */
specifier-qualifier-list:
type-specifier specifier-qualifier-listopt
type-qualifier specifier-qualifier-listopt
struct-declarator-list:
struct-declarator
struct-declarator-list , struct-declarator
struct-declarator:
declarator
declaratoropt : constant-expression
Если вы напишите
struct identifier { };
Это даст вам диагностическое сообщение, потому что вы нарушаете синтаксические правила. Если ты пишешь
struct identifier { int : 0; };
Тогда у вас непустая структура без именованных членов, что делает поведение неопределенным и не требует диагностики:
Если список объявления структуры не содержит именованных членов, поведение не определено.
Обратите внимание, что следующее запрещено, поскольку член гибкого массива не может быть первым:
struct identifier { type ident[]; };