(Быстрый ответ: стандарт C не поддерживает этот тип инициализации; вам придется ознакомиться с документацией вашего компилятора.)
Теперь, когда мы знаем, что язык C, мы можем видеть, что говорит стандарт об этом.
C99 6.7.8, пункт 4:
Все выражения в инициализаторе для объекта, который имеет статический
продолжительность хранения должна быть константными выражениями или строковыми литералами.
И новый стандарт 2011 года (по крайней мере, проект, который я имею) гласит:
Все выражения в инициализаторе для объекта, который имеет статический
продолжительность хранения должна быть константными выражениями или строковыми литералами.
Таким образом, инициализация статического объекта (например, глобального, такого как ваш current_time
) с помощью вызова функции является нарушением ограничения. Компилятор может отклонить его или может принять его с предупреждением и делать все, что ему нравится, если он обеспечивает расширение языка.
Стандарт C не говорит, когда происходит инициализация, потому что он не допускает такого рода инициализацию. По сути, ни один из ваших кодов не может быть выполнен до начала выполнения функции main()
.
Очевидно, ваш компилятор разрешает это как расширение (при условии, что вы действительно скомпилировали этот код). Вам нужно будет обратиться к документации вашего компилятора, чтобы узнать, какова семантика.
(Обычно main
объявляется как int main(void)
или int main(int argc, char *argv[])
или эквивалентный, или некоторым образом, определяемым реализацией. Во многих случаях void main()
указывает программиста, который изучил C из плохо написанной книги, из их слишком много. Но это относится только к размещенным реализациям. Отдельно стоящие реализации, обычно для встроенных систем, могут определять точку входа в программу любым удобным для них способом. Поскольку вы ориентируетесь на Arduino, вы, вероятно, используете автономную реализацию, и Вы должны объявить main()
, однако, документация компилятора говорит вам.)