2

Я прочитал некоторую противоречивую информацию о присвоении значений глобальным переменным при объявлении.Ценность-инициализация глобальных переменных при объявлении

Некоторые, кажется, позволяет это:

int g_int = 5; 

в то время как другие говорят, что он должен быть initalized в основном:

int g_int; 
int main() { 
    g_int = 5; 
} 

Я лично использовал первый стиль в Visual Studio 2008-2013 без каких-либо проблем ,

  • Является ли это законным C++?
  • Если это не определено в C++, это все-таки поведение, определяемое компилятором в MSVC и g ++?
  • Если это законно, назначение результата функции также является законным, при этом функциональный вызов гарантированно выполняется до main? Например. time_t g_starttime = time();?
+0

'g_int = 5; 'не инициализируется в основном. Это назначение. – NathanOliver

ответ

1

другие говорят, что он должен быть инициализирован в основных

«Другие» неправильны: хотя переменные определены внутри блока перевода, конечно может быть назначен в main, они не должны назначается в main.

Это совершенно законно в C++. Присвоение результата функции также является законным, и инициализация гарантированно произойдет до ввода main.

Кроме того, если у вас есть несколько объявлений с инициализацией внутри одной единицы перевода (т. Е. Внутри одного и того же файла CPP), они гарантированно выполняются в текстовом порядке.Если вы сделаете это

int twoTimes(int i) { 
    cout << "Doubling " << i << endl; 
    return 2*i; 
} 
int a = twoTimes(7); 
int b = twoTimes(8); 
int main() { 
    ... 
} 

выход гарантированно

Doubling 7 
Doubling 8 
1

Прежде всего, int g_int = 5;int g_int;) не является декларацией, это определение.

Является ли это законным C++?

Да, и g_int будет инициализирован значением 5. (BTW:. Для int g_int;g_int будет инициализирован со значением 0)

Если это законно, является присвоение результата функции также юридическим, с вызовом функции гарантированно будет выполняться перед основными? Например. time_t g_starttime = time() ;?

Да, это гарантировано.

BTW: g_int = 5; в main() не инициализация, это просто назначение. Это означает, что если g_int используется до ввода main(), будет использоваться значение по умолчанию 0 (не 5).

Смежные вопросы