Имя вводится в программе с помощью описания,
которое задает его тип и, возможно, начальную величину. Даны понятия описания, определения, области
видимости имен, времени существования объектов
и типов.
Перед использованием имени (идентификатора)
в C++ программе оно должно быть описано. То есть следует задать его тип, чтобы сообщить компилятору, к какого вида объектам относится имя. Рассмотрим несколько
примеров, показывающих разнообразие описаний:
char ch;
int count = 1;
char* name = «Bjarne»;
struct complex {float re, im;};
complex cvar;
extern complex sqrt(complex);
extern int error_number;
typedef complex point;
float real(complex* p) {return p->re;};
const double pi = 3.1415926535897932385;
struct user;
Большинство описаний служит также определениями;
т. е. они к тому же определяют для имени сущность, к которой оно относится. Для ch, count и cvar этой сущностью служит соответствующий объем памяти, который
должен применяться как переменная, — эта память будет выделена. Для real это заданная функция, для constant pi это значение 3.1415926535897932385, для complex этой сущностью служит новый тип. Для point
это тип complex, поэтому point принимает смысл
complex. Только описания
extern complex sqrt(complex);
extern int error_number;
struct user;
не служат одновременно определениями. То есть
объект, к которому они относятся, должен быть определен где-то еще. Код (тело) функции sqrt должен определяться определенным описанием, память для переменной error_number типа int должна выделяться другим
описанием, и какое-то другое описание типа user должно определять, что он из себя представляет. В C++
программе всегда должно присутствовать только одно
определение каждого имени, но описаний может быть
большое количество и все описания должны согласовы-
ваться с типом объекта, которого они касаются, поэтому в этом фрагменте есть две ошибки:
int count;
int count; -- ошибка: переопределение
exnern int error_number;
exnern int error_number; --
ошибка: несоответствие типов