Урок 9.5. Модификаторы типа функции

9.5. Модификаторы типа функции

В дополнение external и static, Borland-C поддерживает ряд модификаторов типа для описания функций: pascal, cdecl, interrupt. Borland-C позволяет обращаться из Си-программы к программам, написанным на других языках, и наоборот. При этом мы имеем дело с двумя важными объектами: именами функций и передаваемыми параметрами.

Когда программа компилируется в Borland-C, имена функций и передаваемые параметры появляются в объектном коде в своем первоначальном виде (т.е. набранными заглавными, строчными или теми и другими буквами). Кроме того, им предшествует символ подчеркивания (_), если при компиляции не использовалась опция -u- . (По умолчанию она не используется.)

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

Модификатор pascal позволяет писать на языке Си функции, которые могут быть вызваны из программ, написанных на другом языке, и наоборот, позволяет обращаться из Си-программ к внешним подпрограммам, написанным на других языках.

Если использован модификатор pascal, то все символы идентификаторов функции и параметров преобразуются к верхнему регистру и к ним не добавляется символ подчеркивания.

Например, если объявлена и откомпилирована функция:

pascal void putnums(int i,int j,int k)
{
printf(" Ответ :%d,%d и %d\n",i,j,k);

}

то другая Си-программа может затем подключить данную функцию редактором связей и обращаться к ней, используя описание:

pascal void putnums(int i,int j,int k);

void main()
{
putnums
(1,4,9);
}

Функции типа pascal не могут иметь различное число аргументов, как, например, функция printf. Модификатору pascal соответствует директива компилятора , т.е. использование при компиляции опции будет приводить к тому, что все функции (и указатели на эти функции) будут рассматриваться как если бы они имели тип pascal.

Модификатор cdecl используется с функциями или указателями на функции для того, чтобы отменить директиву компилятора и объявить функцию как обычную Си-функцию. Например, если при компиляции установлена опция , а в программе нужно использовать функцию printf() (использование которой не разрешается модификатором pascal из-за переменного числа параметров), нужно поступить следующим образом:

 

exstern cdecl void printf();
putnums(int i,int j,int k);

cdecl void main()
{
putnums(1,4,9);

}

putnums(int i,int j,int k)
{
printf("Ответ: %d,%d u %d\n",i,j,k);

}

Более того, если программа компилируется с опцией , все функции из системной библиотеки, а также главную функцию main() необходимо объявить как cdecl. Все функции в системных include–файлах (например stdio.h) имеют тип cdecl. Это позволяет подключать системные библиотеки, если используется опция -р при компиляции.

Модификатор interrupt предназначен для использования с векторами прерывания процессора 8086/8088. Borland-C будет компилировать функцию типа interrupt с дополнительным входом и кодом завершения, так что регистры AX,BX,CX,DX,SI,DI,ES u DS сохраняются. Другие регистры BP,SP,SS,CS и IP сохраняются как часть последовательности Си-вызова или часть самой обработки прерывания.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов