Что такое определение, объявление и инициализация переменной

Объясните пожалуйста доступно, что такое определение, объявление и инициализация переменной. Как их отличать синтаксически. Что без чего можно делать, а что без чего нельзя. Прочитал уже несколько статей, теперь в голове только каша


Ответы (1 шт):

Автор решения: gbg

Нижеизложенное сильно упрощено. Здесь не преследуется цель рассказать подробно все нюансы - для этого лучше почитать Стандарт языка.

Объявление (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. Так писать нельзя, это неправильно.

→ Ссылка