 |
int p(int,long) /* Функция с типомвозврата int,принима-
ющая два параметра, первый типа int, и второй типа long */
int pascal q(void); /* функция типа pascal, возвращаю-
щая int и не принимающая параметров */
char far *s(char *source, int kind); /* Функция,
возвращающая дальний указатель на char и принимающая два па-
раметра: превый - дальний указатель на char, а второй int */
int printf(char *format,...); /* Функция, возвращающая
int и принимающая фиксированный параметр типа указатель на
char и любое число дополнительных параметров неизвестного
типа */
int (*fp)(int); /* Указатель на функцию, возвращающую
int и принимающую один параметр int */
Объявления
Общий синтаксис для определений внешних функций приво-
дится в следующей таблице:
Определения внешних функций Таблица 1.18
-----------------------------------------------------------
файл:
внешнее-определение
файл внешнее-определение
внешнее-определение:
определение-функции
объявление
asm-оператор
определение-функции:
<спецификаторы-объявления> декларатор <список-объявления>
составной-оператор
-----------------------------------------------------------
В целом, определение функции состоит из следующих раз-
делов (грамматика позволяет создание и более сложных конс-
трукций):
- 61 -
1. Опциональные спецификаторы класса памяти: extern или
static. Умолчанием является extern.
2. Тип возврата, возможно void. Умолчанием является
int.
Элементы из пунктов 1 и 2 можно взаимно комбинировать.
3. Опциональные модификаторы: pascal, cdecl, interrupt,
near, far, huge. Умолчание зависит от модели памяти и уста-
новленных опций компилятора.
4. Имя функции.
5. Список объявления параметров, который может быть
пустым, заключенный в круглые скобки. В с предпочтительно
обозначать отсутствие параметров записью func(void). В С до-
пускается и старый стиль записи func(), но это может приво-
дить к неоднозначностям и возможным ошибкам. В С++ выдается
соответствующее предупреждение.
6. Тело функции, представляющее собой коды, выполняемые
при вызове функции.
Объявления формальных параметров
Список объявления формальных параметров имеет синтак-
сис, аналогичный синтаксису обычных объявлений идентификато-
ров. ниже приводится несколько примеров:
int func(void) (* // аргументы отсутствуют
С++int func(T! t1, T2 t2, T3 t3=1) (*
// три простых параметра,
// один из которых с аргументо
// по умолчанию
C++int func(T1* ptr1, T2& tref) (*
// аргументы указатель и ссылк
int func(register int i) (* // запрос регистра для аргумен
int func(char *str,...) (* /* один строковый аргумент ипе-
ременное число прочих аргументов, либо фиксирован-
ное число аргументов с переменными типами */
В С++ вы можете задавать, как показано, аргументы по
умолчанию. Параметры со значениями по умолчанию должны яв-
ляться последними параметрами в списке. Типы аргументов мо-
гут быть скалярными, структурами,объединениями, перечислимо-
го типа, указателямиили ссылками на структуры или
объединения, или указателями на функции или классы.
Многоточие (...) означает, что функция будет вызываться в
разных случаях с различными наборами аргументов. Многоточие
может следовать за подсписком объявлений известных аргумен-
тов. Такая форма прототипа уменьшает число выполняемых ком-
пилятором проверок.
Все объявленные параметры автоматически получают контекст, а
также длительность данной функции. Единственным допустимым
для них классом спецификатора является register.
В деклараторах формальных параметров могут использоваться
модификаторы const и volatile.
Вызовы функций и преобразования аргументов
- 62 -
Функция вызывается с фактическими аргументами, помещенными в
той же последовательности,что и соответствующие им формаль-
ные аргументы. преобразования фактических аргументов выпол-
няется,как если бы ониинициализировались значениями формаль-
ных аргументов при объявлении типов.
Ниже приводится краткое изложение правил, управляющих
обработкой в Turbo C++ модификаторов языка и формальных па-
раметров при вызове функций, как при наличии прототипа, так
и при его отсутствии:
1. Модификаторы языка для определения функции должны соот-
ветствовать модификаторам, используемым в объявлении функ-
ции, при всех вызовах функции.
2. Функция может модифицировать значения своих формальных
параметров, но это не влияет на фактические аргументы в вы-
зывающей программе, за исключением аргументов типа ссылка в
C++.
Если ранее не был объявлен прототип функции, Turbo C++ пре-
образует интегральные аргументы при вызове функции в соот-
ветствии с правилами интегрального расширения, описанными в
разделе "Стандартные преобразования" на стр.41 оригинала.
При наличии в контексте прототипа функции Turbo C++ преобра-
зует данные аргументы к объявленным типам параметров, как
при операции присвоения.
Если прототип функции включает в себя многоточие (...), то
Turbo C++ преобразует все данные аргументы функции, как и в
любом другом прототипе (использующем многоточие). Компилятор
расширяет любые аргументы, заданные помимо фиксированных па-
раметров, по обычным правилам для аргументов функции без
прототипов.
При наличии прототипа число аргументов в прототипе и
функции должно совпадать (при условии, что в прототипе не
задано многоточие).Типы аргументов должны являться совмести-
мы в такой степени, чтобы операция присвоения выполнялась
правильно. Вы всегда можете использовать явные приведения,
чтобы преобразовать аргумент к типу, приемлемому для прото-
типа функции.
Важное замечание
Если прототип функции не соответствует фактическому оп-
ределению функции, Turbo C++ обнаружит это в том и том слу-
чае, когда определение содержится в той же единице
компиляции, что и прототип. При создании библиотеки подпрог-
рамм с соответствующим файлом заголовкапрототипов незабывай-
те включать этот файл при компиляции библиотеки, с тем, что-
бы любые расхождения между прототипом и фактическими
определениями функции были обнаружены. С++ обеспечивает при
компоновке контроль типов, поэтому все различия между ожида-
емыми и действительно заданными параметрами будут компонов-
щиком обнаружены.
Структуры
Инициализация структуры описана на стр.42 оригинала.
Структура - это производный тип данных, обычно предс-
тавляющий собой определяемый пользователем набор именованных
компонентов. Эти компоненты могут быть любого типа, как фун-
даментального, так и производного (с некоторыми описываемыми
- 63 -
далее ограничениями), и располагаться в любой последователь-
ности. Кроме того, компонент структуры может иметь тип бито-
вого поля, более нигде не разрешаемого. Тип струтуры в Turbo
C++ позволяет обрабатывать сложные структуры данных так же
легко, как и простые переменные.
В С++ тип структуры рассматривается как тип класса (с
определенными различиями: доступ по умолчанию устанавливает-
ся public, а умолчание для базового класса также public).
Это позволяет организовывать более сложное управление компо-
нентами структуры при помощи спецификаторов доступа С++:
public (это умолчание), private и protected. Помимо данного
опционального механизма управления доступом и упомянутых ис-
ключений, далее рассматриваемые синтаксис и применение
структур относятся равно к структурам С и С++.
Объявление структур выполняется при помощи ключевого
|