Очень немного в C является незаконным, то есть вы не можете этого сделать. Скорее, многие вещи не определены стандартом C, а это означает, что, если вы их делаете, стандарт C не говорит, что произойдет. Структуры без именованных элементов - это такие вещи.
C 2018 6.7.2.1 8 частично говорит:
Если список-декларации-структуры не содержит именованных членов, ни напрямую, ни через анонимную структуру или анонимное объединение, поведение не определено.
Если вам нужно что-то, служащее «неизвестным типом», и вы не хотите использовать void
, вы можете объявить структуру, тег которой известен, а содержимое - нет, например:
struct foo;
Затем вы можете использовать указатели на такие структуры (например, вы можете определить указатель struct foo *p;
), но компилятор не будет знать размер или содержимое таких структур, поэтому он не может помочь вам выделить их, управлять их массивами или иным образом использовать их, кроме как путем передачи указателей и запроса внешних подпрограмм (которые действительно знают о содержимом).
Обычно при операциях между подпрограммами C в одном модуле и подпрограммами C в другом модуле:
- В одном исходном модуле, который не знал о содержимом структуры, вы использовали бы указатель (
struct foo *
).
- Другой исходный модуль (часто это какая-то программная библиотека) будет знать о содержимом структуры. В собственном исходном коде он определил бы полную структуру с помощью
struct foo { /* various things */ };
, и он будет выполнять службы для этой структуры для первого модуля.
- Между двумя такими модулями C правила стандарта C будут определять поведение.
Поскольку вы взаимодействуете между C и Ada, правила для этих взаимодействий должны предоставляться вашими реализациями C и Ada.
person
Eric Postpischil
schedule
27.12.2018
struct C{ };
даже не соответствует стандартизированному синтаксису.struct C { _Static_assert(1,""); };
(_Static_assert
- ненужное уродство), но для этого у вас есть UB, если внутри структуры нет именованных членов (port70.net/~nsz/c/c11/n1570.html#6.7.2.1p8). - person PSkocik   schedule 04.01.2019