Страница 44 из 56
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
int (f1); Функция, возвращающая целое.
typedef int *intptr;
intptr p1; Указатель на целое.
intptr f2(); Функция, возвращающая указа-
тель на целое.
typedef int far *farptr;
farptr p2; Far-указатель на целое.
farptr f3(); Near-функция, возвращающая
far-указатель на целое.
intptr far f4(); Far-функция, возвращающая
near-указатель на целое.
typedef int (*fncptr1)(int);
fncptr1 fp1; Указатель на функцию, воз-
вращающую целое и принимаю-
щую целое.
typedef int (*fncptr2)(intptr);
fncptr2 fp2; Указатель на функцию, воз-
вращающую целое и принимаю-
щую указатель на целое.
typedef int (far *ffptr)(far ptr);
ffptr fp3; Far - указатель на функцию,
вовращающую целое и принима-
ющую far-указатель на целое.
typedef ffptr ffplist[5];
ffplist list; Массив из 5 far- указателей
на функции, возвращающие це-
лое и принимающие far-указа-
ли на целое.
- 361,362 -
ffptr gopher(ffplist); Near-функция,принимающая мас-
сив из 5 far-указателей на
функции, возвращающие целое и
принимающие far-указатели на
целое, и возвращающая один из
этих указателей.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Таблица 12.4. Объявление указателей при помощи typedef
Как видите, есть значительная разница в наглядности и чет-
кости восприятия между объявлением gopher при помощи typedef и
предыдущим способом объявления. При грамотном использовании опе-
раторов типа typedef и прототипов функций вам легче будет состав-
лять, отлаживать и сопровождать ваши программы.
Использование библиотечных файлов
----------------------------------------------------------------
Турбо Си предлагает версию стандартных библиотечных подпрог-
рамм для каждой из шести моделей памяти. Применяясь для работы в
интегрированной среде (TC), Турбо Си достаточно хорошо приспособ-
лен для компоновки требуемых библиотек в нужном порядке в зависи-
мости от выбранной вами модели. Кроме того, будучи применен как
автономный компилятор (TCC), Турбо Си достаточно хорошо приспо-
соблен для автоматической компоновки.
Однако, если вы используете непосредственно TLINK (компонов-
щик Турбо Си) как автономный редактор связей, то вам необходимо
точно определить, какие библиотеки использовать. Если вы не соби-
раетесь использовать все 6 моделей памяти, то вам нужно перепи-
сать на рабочий или жесткий диск лишь файлы используемой модели
(моделей).
- 363,364 -
Ниже приведен список библиотечных файлов для каждой модели
памяти.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Крохотная COT.OBJ, MATHS.LIB, CS.LIB
Малая COS.OBJ, MATHS.LIB, CS.LIB
Компактная COС.OBJ, MATHC.LIB, CC.LIB
Средняя COM.OBJ, MATHM.LIB, CM.LIB
#include "myputs.h"
main()
{
char near *mystr;
mystr = "Hello, world\n";
myputs(mystr);
}
Когда вы компилируете эту программу, Турбо Си читает прото-
тип функции из MYPUTS.H и воспринимает его как far-функцию, пред-
- 367,368 -
полагающую наличие far-указателя. Поэтому он сформирует надлежа-
щую программу, даже если она скомпилирована с использованием ма-
лой модели памяти.
Наконец, как же поступать, если вам надо выполнить компонов-
ку с библиотечными подпрограммами? Лучше всего в этом случае ис-
пользовать одну из библиотек больших моделей, объявив все ее ком-
поненты как far. Для этого скопируйте каждый заголовочный файл,
который вы обычно используете (такой как STDIO.H) и переименуйте
соответствующим образом копии (например, FSTDIO.H).
После этого отредактируйте каждый скопированный прототип
функции таким образом, чтобы он был однозначно far, например:
int far cdecl printf(char far * format, ...);