На самом деле вы можете вызывать функции в глобальном масштабе.
int foo()
{
return 5;
}
int bar = foo();
Это просто способ, которым C был разработан несколько лет назад, и вы не можете запускать функции самостоятельно в глобальном масштабе. Весь программный код начинается с main
.
В общем, чем меньше вы зависите от глобальной инициализации (по возможности избегайте ее), тем меньше вам придется беспокоиться о странных ошибках статического запуска и таких проблемах, возникающих случайным образом.
Массивы - это другой случай, потому что вы никогда не можете присвоить результат вызова функции массиву - единственный способ инициализировать его в этом случае, как вы заметили, внутри конструктора.
РЕДАКТИРОВАТЬ: несколько злой подход к инициализации массива, вдохновленный комментарием:
bool do_init(int a[50])
{
// Do whatever to init the array here.
return true;
}
int array[50];
bool init_array = do_init(array);
Это работает только потому, что в модуле перевода порядок создания / инициализации глобалов гарантированно соответствует порядку их появления в файле.