Внешнее определение функции

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

18.1. Внешнее определение функции

Определение функции имеет форму

определение-функции:

спецификаторы-описания описатель-функции

тело-функции

необ

Единственными спецификаторами класса памяти, допускаемыми в

качестве спецификаторов-описания, являются EXTERN или

STATIC; о различии между ними смотри п. 19.2. Описатель фун-

кции подобен описателю для “функции, возвращающей...”, за

исключением того, что он перечисляет формальные параметры

определяемой функции.

 

Оисатель-функции:

описатель (список-параметров

необ)

список параметров:

идентификатор

идентификатор, список-параметров

 

тело-функции имеет форму

тело-функции:

список-описаний составной-оператор

·    
215 -

Идентификаторы из списка параметров и только они могут

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

торого не указан, считается имеющим тип INT. Единственным

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

REGISTER; если такой класс памяти специфицирован, то в нача-

ле выполнения функции соответствующий фактический параметр

копируется, если это возможно, в регистр.

Вот простой пример полного определения функции:

INT MAX(A, B, C)

INT A, B, C;

\(

INT M;

M = (A>B) ? A:B;

RETURN((M>C) ? M:C);

\)

 

Здесь INT - спецификатор-типа, MAX(A,B,C) - описатель-функ-

ции, INT A,B,C; - список-описаний формальных параметров, \(

... \) - Блок, содержащий текст оператора.

В языке “C” все фактические параметры типа FLOAT преоб-

разуются к типу DOUBLE, так что описания формальных парамет-

ров, объявленных как FLOAT, приспособлены прочесть параметры

типа DOUBLE. Аналогично, поскольку ссылка на массив в любом

контексте (в частности в фактическом параметре) рассматрива-

ется как указатель на первый элемент массива, описания фор-

мальных параметров вила “массив ...” приспособлены прочесть

: “указатель на ...”. И наконец, поскольку структуры,

объединения и функции не могут быть переданы функции, бесс-

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

объединение или функцию (указатели на такие объекты, конеч-

но, допускаются).

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

 

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

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

описание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


·     216 -

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

находятся.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

TYPEDEF FLOAT DISTANCE;

...

\(

AUTO INT DISTANCE;

...

 

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

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

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

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


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх