Основные понятия

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

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

Описания и определения

Описание делает известным в программе одно или несколько имен. Описание считается определением. Ниже приведены примеры описаний:

		
int a;
var c=1;
f(x) { return x+a; }
struct S a;

	

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

Область видимости

Есть три вида областей видимости: локальная, глобальная и класс.

Локальная: Имя, описанное в блоке, локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Имена формальных параметров рассматриваются, как если бы они были описаны в самом объемлющем блоке этой функции.

Глобальная: Имя, описанное вне любого блока, может использоваться в любой единице трансляции. Имя, используемое в данной единице трансляции, и не описанное в ней считается глобальным именем, описанным в другой единице трансляции.

Класс: Имя члена класса локально для его класса и может использоваться только после примененной к объекту его класса операции селектора (точка).

Имя может быть скрыто явным описанием того же имени в объемлющем блоке. Моментом описания имени считается момент завершения описателя имени, предшествующей части инициализации (если она есть). Например:

		
int y=12;
int x=x;

	

Здесь x инициализируется своим собственным (неопределенным) значением.

Связывание

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

Классы памяти

Существует два класса памяти: автоматический и статический.

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

Статические объекты инициализируются всякий раз при загрузке модуля, где они определены и уничтожаются при выгрузке этого модуля.

Все глобальные объекты имеют статический класс памяти. Все локальные объекты имеют автоматический класс памяти.

Типы

Существуют два вида типов:

Lvalue

Любой объект — это некоторая область памяти, lvalue — выражение, ссылающееся на объект или функцию. Очевидным примером lvalue будет имя объекта. Существуют операции, порождающие адреса, например, если E — одномерный массив, то E[0] — lvalue, соответствующее первому элементу из E.

При обсуждении всех операций указывается, применимы ли они к lvalue операндам, и порождают ли они сами lvalue.