Подтвердить что ты не робот

Можно ли инициализировать глобальную переменную с результатом вызова функции?

Является ли следующий код законным?

int add(int a, int b)
{
    return a + b;
}

int myvar = add(1, 2);

int main() { /* ... */ }

Почему, или почему нет?

4b9b3361

Ответ 1

Да. Да, это так.

Статические инициализаторы могут вызывать функции, если они находятся в области видимости.

[dcl.decl] (формулировка 2003 года, 8/2):

Можно также указать начальные значения в объявлении; инициализаторы обсуждается в 8.5 и 12.6.

[dcl.init] (формулировка 2003 года, 8.5/2):

Автоматический, зарегистрировать, статический и внешние переменные области пространства имен может быть инициализирован произвольным выражения, содержащие литералы и ранее объявленные переменные и Функции.

(Не следует вводить в заблуждение из-за отсутствия ключевого слова static, которое имеет всевозможные значения. Ваша переменная myvar объявляется в области пространства имен и, следовательно, имеет статическую продолжительность хранения.)