Step 8 (S-2839)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/534/step/8

Объявление (declaration) — вводит имя, возможно, не определяя деталей. Например, ниже перечислены объявления:

  • int a; — объявление переменной типа int,
  • void foo(); — объявление функции с именем foo,
  • void bar() { foo(); } — объявление функции с именем bar.

Определение (definition) — это объявление, дополнительно определяющее детали, необходимые компилятору. Из перечисленных выше объявлений, определениями являются только два:

  • int a; — объявление переменной типа int,
  • void bar() { foo(); } — объявление функции вместе с телом является определением.

Для определения переменной достаточно указать ее тип, а для определения функций, кроме имени, типов параметров и возвращаемого значения, нужно указать еще тело функции. Проще говоря, определение содержит всю информацию, необходимую компилятору, чтобы выделить память для хранения объекта.

В C++ есть также возможность объявить переменную, не определяя ее:
 extern int a;
Ключевое слово extern как раз и позволяет сказать компилятору, что переменную нужно только объявить, при этом не нужно выделять под нее память — память под нее должна быть выделена в другом месте (возможно даже в другом файле).

Программы C++ допускают существование нескольких объявлений одного объекта (переменной, функции и др.), но не допускают наличия нескольких определений. Как правило, нарушение этого принципа приводит к ошибкам компоновщика, но может приводить и к ошибкам компиляции (повторное определение типов).