Когда вы определяете структуру глобально, почему вы не можете определить элементы структуры глобально (вне использования синтаксиса инициализатора)?
Потому что вы пытаетесь сделать этоне определение или инициализация .Это назначение .Вы можете объявлять, определять и инициализировать в глобальной области видимости, но не назначать.
Это не только для структур.Это относится и к переменным.Вне функции вы можете только объявить и инициализировать переменные.Вы не можете выполнять регулярные задания или что-либо еще по этому вопросу.Я не уверен на 100% в деталях, но я вполне уверен, что вы не можете сделать ничего в глобальной области видимости, чего нельзя сделать во время компиляции.
Так что это будет работать:
int x=5;
Но не это:
int x;
x = 5;
Ну, на самом деле это действительно, но выдаст загадочные предупреждения о warning: data definition has no type or storage class
и warning: type defaults to ‘int’ in declaration of ‘x’
Однако, только потому, что он компилируется, он не будет делать то, что вы думаетебудут.На самом деле загадочные предупреждения, которые вы не понимаете, очень часто являются хорошим индикатором того, что код будет делать то, чего вы не хотите и не понимаете.Этот код выполняет неявное переопределение из x
с последующей инициализацией .Это разрешено, если оно не было инициализировано ранее, поэтому это недопустимо:
int x = 3;
x = 5; // Not ok, because x is already initialized
И здесь сообщение об ошибке проясняет, почему скомпилирован предыдущий пример: error: redefinition of ‘x’
.
Аналогично, это также недопустимо:
int x = foo();
Выдает эту ошибку:
main.c:3:7: error: initializer element is not constant
int x = foo();
^~~