Прямой ответ заключается в том, что определение структуры объявляет тип, а не переменную, которую можно инициализировать. Ваш пример:
struct s { int i=10; };
Это не объявляет какую-либо переменную - оно определяет тип. Чтобы объявить переменную, вы должны добавить имя между }
и ;
, а затем инициализировать его:
struct s { int i; } t = { 10 };
Как отметили Шекеры, в C99 вы также можете использовать назначенные инициализаторы (что является замечательным улучшением - однажды C догонит другие функции, которые Fortran 66 имел для инициализации данных, в основном повторяя инициализаторы заданным числом раз). С этой простой структурой нет никакой выгоды. Если у вас есть структура, скажем, с 20 членами, и вам нужно только инициализировать один из них (скажем, потому что у вас есть флаг, который указывает, что остальная часть структуры инициализирована или нет), это более полезно:
struct s { int i; } t = { .i = 10 };
Эта нотация также может использоваться для инициализации союзов, чтобы выбрать, какой элемент объединения инициализируется.