Что такое определение, объявление и инициализация переменной
Объясните пожалуйста доступно, что такое определение, объявление и инициализация переменной. Как их отличать синтаксически. Что без чего можно делать, а что без чего нельзя. Прочитал уже несколько статей, теперь в голове только каша
Ответы (1 шт):
Нижеизложенное сильно упрощено. Здесь не преследуется цель рассказать подробно все нюансы - для этого лучше почитать Стандарт языка.
Объявление (declaration) переменной информирует компилятор о том, что где-то, возможно, в другой единице трансляции (очень грубо, в другом cpp-файле) выделено sizeof байт под хранение переменной такого-то типа с таким-то именем. Деклараций можно писать сколько угодно в разных блоках кода, по одной на блок.
Определение (definition) переменной информирует тот же компилятор о том, что память под переменную нужно взять прямо в этом месте, где написано данное определение. Именно в этой единице трансляции. Определение на всю программу может быть одно и только одно.
Этими процессами управляют квалификаторы static, extern, thread_local и некоторые другие.
Чаще всего, происходят одновременно объявление и определение, например
int a; // вне функций - заставит компилятор создать глобальную переменную.
{
int a; //в блоке кода - переменная будет существовать до конца блока, а память будет выделена на стеке
}
примером чисто объявления идентификатора будет объявление его внутри структуры:
struct A
{
int a;
};
Никакая память на данный момент не выделена, но компилятор теперь знает, что у него такое есть. Память выделится там, где определят структуру;
Использование ключевого слова extern, которое как раз говорит компилятору, что переменная объявлена где-то в другой единице трансляции
//alpha.cpp
int a;
//beta.cpp
extern int a; // указали, что будем пользоваться `int a` из `alpha.cpp`
Само связывание имен и памяти произойдет на этапе компоновки программы.
Инициализация в смысле C++ - это когда определение и объявление объединяют с присваиванием начального значения;
{
int a = 8;
}
Вот такое:
{
int a;
a=8;
}
Будет инициализацией в смысле практики программирования (самая первая запись в переменную), но не будет инициализацией в смысле C++ - это идущие подряд определение и присваивание.
Чтение из неинициализированной переменной - форменное UB. Так писать нельзя, это неправильно.