Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Керниган, Ричи. Язык C.docx
Скачиваний:
5
Добавлен:
05.05.2019
Размер:
377.71 Кб
Скачать

18.2. Внешние определения данных

Внешнее определение данных имеет форму

определение-данных:

описание

Классом памяти таких данных может быть EXTERN (в частности,

по умолчанию) или STATIC, но не AUTO или REGISTER.

19. Правила, определяющие область действия

Вся C-программа необязательно компилируется одновремен-

но; исходный текст программы может храниться в нескольких

файлах и ранее скомпилированные процедуры могут загружаться

из библиотек. Связь между функциями может осуществляться как

через явные обращения, так и в результате манипулирования с

внешними данными.

Поэтому следует рассмотреть два вида областей действия:

во-первых, ту, которая может быть названа лексической об-

ластью действия идентификатора и которая по существу являет-

ся той областью в программе, где этот идентификатор можно

использовать, не вызывая диагностического сообщения "неопре-

деленный идентификатор"; и во-вторых, область действия, ко-

торая связана с внешними идентификаторами и которая характе-

ризуется правилом, что ссылки на один и тот же внешний иден-

тификатор являются ссылками на один и тот же объект.

19.1. Лексическая область действия

Лексическая область действия идентификаторов, описанных

во внешних определениях, простирается от определения до кон-

ца исходного файла, в котором он находится. Лексическая об-

ласть действия идентификаторов, являющихся формальными пара-

метрами, распространяется на ту функцию, к которой они отно-

сятся. Лексическая область действия идентификаторов, описан-

ных в начале блока, простирается до конца этого блока. Лек-

сической областью действия меток является та функция, в ко-

торой они находятся.

Поскольку все обращения на один и тот же внешний иденти-

фикатор обращаются к одному и тому же объекту (см. П. 19.2),

Компилятор проверяет все описания одного и того же внешнего

идентификатора на совместимость; в действительности их об-

ласть действия распространяется на весь файл, в котором они

находятся.

Во всех случаях, однако, есть некоторый идентификатор,

явным образом описан в начале блока, включая и блок, который

образует функцию, то действие любого описания этого иденти-

фикатора вне блока приостанавливается до конца этого блока.

Напомним также (п. 16.5), Что идентификаторы, соответст-

вующие обычным переменным, с одной стороны, и идентификато-

ры, соответствующие членам и ярлыкам структур и объединений,

с другой стороны, формируют два непересекающихся класса, ко-

торые не вступают в противоречие. Члены и ярлыки подчиняются

тем же самым правилам определения областей действия, как и

другие идентификаторы. Имена, специфицируемые с помощью

TYPEDEF, входят в тот же класс, что и обычные идентификато-

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

во внутреннем описании тип должен быть указан явно:

TYPEDEF FLOAT DISTANCE;

...

\(

AUTO INT DISTANCE;

...

Во втором описании спецификатор типа INT должен присутство-

вать, так как в противном случае это описание будет принято

за описание без описателей с типом DISTANCE (прим. Автора:

согласитесь, что лед здесь тонок.).