Изменение поведения ошибки "неинициализированная локальная переменная"
Рассмотрим следующий код:
#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int count123;
for (int c = 0; c < 10; c++)
{
count123 += c;
}
return 0;
}
После компиляции я получаю предупреждение: warning C4700: uninitialized local variable 'count123' used
Я знаю, что причина заключается в объявлении count123, но не в инициализации.
Но если я объявлю count123 как глобальную переменную, как показано в коде ниже, предупреждение исчезнет.
#include "stdafx.h"
using namespace std;
int count123;
int _tmain(int argc, _TCHAR* argv[])
{
for (int c = 0; c < 10; c++)
{
count123 += c;
}
return 0;
}
Насколько я знаю, объявление count123 в качестве глобальной переменной изменит ее область, но как это убирает предупреждение? Пожалуйста, руководство.
4 ответа
Глобальные переменные инициализируются нулями (кстати, то же самое относится и к статическим переменным). Вот почему вы не получаете это сообщение.
Вот стандартная цитата:
8.5 / 10: Каждый объект статической длительности хранения инициализируется нулями при запуске программы перед любой другой инициализацией. В некоторых случаях дополнительная инициализация выполняется позже.
Глобальные переменные являются статическими переменными хранения и по умолчанию инициализируются нулями. Для получения дополнительной информации, пожалуйста, смотрите ответ здесь.
Глобальные переменные всегда инициализируются нулем, вспомните глобальный указатель, инициализированный каким-то случайным значением, и вы по ошибке использовали его в своем коде. Глобальная инициализация делает его пустым, поэтому вы можете проверить его и использовать соответствующим образом.
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется равным (положительному или без знака) нулю;
Глобальные переменные по умолчанию инициализируются нулем, поэтому вы не получили предупреждений.
Вы можете легко получить черновик стандартов C++, а затем прочитать раздел 8.5 Инициализаторы:
10 [Примечание: каждый объект статической длительности хранения инициализируется нулями при запуске программы перед любой другой инициализацией. В некоторых случаях дополнительная инициализация выполняется позже. —Конечная записка]