Программирование >>  Перегруженные имена функций и идентификаторы 

1 2 3 [ 4 ] 5 6 7 ... 210


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

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

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

Однако, переменные, заданные классом памяти static на внешнем уровне, видимы только внутри исходного файла, в котором они определены.

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

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

Функции класса памяти static видимы только в исходном файле, в котором они определены. Все другие функции являются глобально видимыми.



В следующем примере программы иллюстрируются блоки, вложения и видимость переменных.

/* i defined at external level */

int i = 1;

/* main function defined at external level */ main ()

/* prints 1 (value of external level i) */

printf( %d\n , i);

/* first nested block */

/* i and j defined at internal level */ int i = 2, j = 3; /* prints 2, 3 */ printf( %d\n%d\n , i, j); /* second nested block */

/* i is redefined */

int i = 0;

/* prints 0, 3 */

printf( %d\n%d\n , i, j);

/* end of second nested block */

/* prints 2 (outer definition restored) */

printf( %d\n , i);

/* end of first nested block */

/* prints 1 (external level definition restored */ printf( %d\n , i);

В этом примере показано четыре уровня видимости: самый внешний уровень и три уровня, образованных блоками. Предполагается, что функция printf определена где-нибудь в другом месте программы. Функция main печатает значения 1, 2, 3,

0, 3, 2, 1.

Классы имен

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



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

Чтобы различать идентификаторы для различного рода объектов, компилятор устанавливает так называемые Классы имен. Для избегания противоречий, имена внутри одного класса должны быть уникальными, однако в различных классах могут появляться идентичные имена. Это означает, что можно использовать один и тот же идентификатор для двух или более различных объектов, если объекты принадлежат к различным классам имен. Однозначное разрешение сс1лок компилятор осуществляет по контексту данного идентификатора в программе. Ниже описываются виды объектов, которые можно именовать в программе на Си, а также правила их именования.

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

Однако, имена переменных могут быть переопределены внутри программных блоков.

Имена функций также могу быть переопределены в соответствии с правилами видимости.

Имена формальных параметров функции появляются вместе с именами переменных функции, поэтому имена формальных параметров должны быть отличны от имен переменных. Переобъявление формальных параметров внутри функции приводит к ошибке.

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

Имена typedef относятся к одному классу имен вместе с именами переменных и функций. Поэтому они должны быть



1 2 3 [ 4 ] 5 6 7 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.082
При копировании материалов приветствуются ссылки.
Яндекс.Метрика