GCC - The Complete Reference (537669), страница 47
Текст из файла (страница 47)
Совмещение языков 209 Имя прототипа функции, объявленного в этом файле, составлено из имени класса .)аш н имени входящего в него метода„который собственно использует эту функцию яа языке с. имена функций в таких генерируемых файлах, как наш не11онаейче.(х всегда начинаются с дача, далее следует полное имя класса, затем символ подчеркивания " ", и заканчиваются они именем метода. Таким образом, имя объявляемой функции записывается как дача не11онасьче вауне11о().
Прототип этой новой функции объявляется с двумя параметрами, даже если у метода, объявленного на языке lача, не было параметров. Два этих параметра необходимы в любой функции, вызываемой через интерфейс 3Х1. Первый параметр— указатель на интерфейс, используемый для доступа к списку обрабатываемых в теле функции действительных передаваемых методу аргументов. Второй параметр — указатель на вызывающий функцию объект (здесь — на переменную с(хйв объекта Не11онас 1че ) . Далее приводится реализация на языке Сфункции, соответствующей прототипу, абьявленному в заголовочном файле не11опгасХче.
Вл /* Не11омасхче.с */ Вьпс1исе <Зпх.зх> вхпс1ссе "Не11омвс1че.(х" чоьс сача не11снаевче вауне11с(тнхнпч 'епч,зоь5есе емв]х ( рхьПЕК(еа ПасьЧЕ дмх ЬЕ11СХП")Х > В этот код директивами Мйпс1ибе включаются заголовочные файлы зпй.)х и не11онае1че. )х (последний содержит прототип объявляемой функции). код реализации функции содержит в точности те же параметры вызова, что и прототип. По двум следующим командам дсс скомпилирует файл не11онае1че. с в объектный модуль перемещаемого формата и поместит его в разделяемую библиотеку. 3 дсс -крас -с не11снаехче.с -с не11онаехче.с 3 дсс -вввкекз Не11омасхче.о -с 11Ьвреах.во На заключительном этапе следует скопировать библиотеку 11Ьвреа(с.
во в расположение, разрешимое дпя поиска во время выполнения программ используемых ими разделяемых библиотек. Затем можно запустить на выполнение находящуюся в файле не11онас1че. с1авв главную хача-программу нашего примера командой д11: а дьэ Не11онасхче Передача аргументов методу, реализованному на языке системного уровня Так же как и для любого другого Уача-метода, в программах на языке )пга возможна также передача аргументов и системно-ориентированному методу. Также возможно и получение возвращаемого им значения. Применяемые для этого типы в интерфейсе ЛП для языков С и С++ — те же, что определены для интерфейса СЫ.
Они приведены в таблице 10.1. 2 1 О Часть и. Использование Сборного Компилятора Следующий пример — Уача-класс с системно-ориентированным методом, написанным на языке С, который получает четыре целочисленных аргумента типа йпс и возвращает их сумму того же типа. /* Аййуоиг.дача *I риЬ11с с1авв Аййуоиг ( веаезс ( яувееп. 1оайьььгагу("11ьаййгоиг.во")г риь11с веаеьс чоьй паап (ясгъпд агд()) ( Аййроиг аг = пеи Аййуоиг()) йпс ча1ие = аг.вип(1,2,3,4)г Яувееа.оис.рг1пс1п("ТЬе вшв ог гоиг 1в " + ча1ие) ) рив11с пасгче ьпс вип(1пе а,ьпс Ь,ьпс с,ъпс 6): ) Далее следует код реализации на языке С системно-ориентированного метода, используемого в приведенной выше lача-программе: /* Аййуоиг с */ Вйпс1ийе <бпз.Ь> Вапс1ийе "Аййуоиг.Ь" З1пе Юача Аййуоиг вии(ЗИХЕпч *епч, ЗоЬЗесс СЬьв, з1пс а,з1пс Ь,з1пе с,з1пс 6) ( З1пс Соса1 = а + Ь + с + йг гееигп(еоса1)г ) Четыре новых параметра добавляются в конец списка аргументов после пары обязательных аргументов.
тип данных бйпе определен во включаемом заголовочном файле Зпй.Ь. Он соответствует типу йпс языка С и в этом примере используется для объявления всех аргументов и возвращаемого значения функции. Этот пример будет скомпилирован и скомпонован из двух приведенных файлов применением следующей последовательности из четырех команд. Первая создаст класс А66Роиг. с1авв, содержащий главную программу на языке вача. Вторая— заголовочный файл Аййуоиг.
ь на языке с, этот файл содержит прототип вызываемого программой системно-ориентированного метода. Третья команда скомпилирует содержащуюся в исходнике Аййроиг. с рЕаЛиЗацИю этОгО метода, причЕМ ПРи этом будет выработан объектный файл, пригодный для использования в разделяемой (динамической) библиотеке.
Последняя команда создает из полученного объектного файла динамическую библиотеку 11Ьайй~оиг. во. Ф дсб -С Аййуоиг.эача 3 дсЗЬ -Зпъ Аййуоиг 3 дсс -гр1с -с Аййуоиг.с -о Аййроиг.о 3 дсс -виагей Аййуоиг.о -о 11Ьаййгоиг.во Теперь остается только скопировать динамическую библиотеку в такое расположение, где она может быть обнаружена загрузчиком, и запустить программу на выполнение следующей командой: 3 д1З Аййуоиг Глава (О.
совмещение языков 2 1 1 Обратный вызов метода Зача-класса из системно-ориентированного метода на языке С Также предусмотрена возможность и обратного вызова метода /ага-класса из кода системно-ориентированного метода. В следующем примере класса жсЬоиеувего)сев имеется один системно-ориентированный метод и один /ача-метод, используемый для обратного вызова. Системно-ориентированный метод дескеувсго)сев ( ) считывает вводимые с клавиатуры символы и передает каждый из них на вывод, выполняя обратный вызов /ага-метода сЬагасеегСа1Ьас)с ( ) . /" ВСЬоиеувего)сев.теча «/ рпЬ11с с1авв вспокеувего)сев ( вгагяс вувееа. 1оайьуьгагу("11ьдегьеув,во«) рпЪ11с всас1с чояй аа1п(вгг1пд агд()) ( Вснодеувгго)сев е)с = пеа ЕсЬоиеувггохев()т е)с.деекеувего)сев(!т ) рпЬ11с пае1че чсйй деекеувегокев()т рпЬ11с чо1й еЬагассегса11Ьас)с(стсаг сЬагасгег) Яувгеа.опе.рг1пе1п(еЬагасеег)т Системно-ориентированный метод использует два аргумента„которые автоматически передаются каждому методу !)с)! для получения информации, необходимой для выполнения обратного вызова.
Для получения значения применяющегося в )Х! типа бс1авв используется функция аеСОЬЗ есеС1авв ( ) . Этот тип представляет класс объекта, содержащего предназначаемый для обратного вызова метод. Функция деснееЬойхр () возвращает уникальный идентификатор зтого метода в классе.
Затем необходимый метод может быть неоднократно вызван использованием функции Р)(-интерфейса са11уо1йнесьой ( ) . /« дееиеувегоиев.с */ Ипс1пйе <Зп1.Ь> $1пе1пйе <вгйуо. Ь> яяпс1пйе «ВсЬоиеувегоиев.Ь" чс1й сача ВСЬоиеувего)сев десиеувгго)сев(ЗН1апч «епч,яоЬ3есг оЬЗ) ( зсЬаг сЬагасеег = ' 'т зс1авв с1авв = («епч)->аееоЬ~есгс1авв(епч,оЬ~) 3аеГЬой10 1й = («епч)->пегиегпойтр(епч,с1авв, «сЬагасеегса11Ьас)с","(С)Ч«т И(ьй )= О) ( иЬ11е(сЬагасгег != '.') ( сЬагасгег = дегсЬаг()т («епч)->Са11чо1днегЬой(епч,оЬз,яй,снагасеег)/ ) 212 Часть и. Использование Сборного Компилятора Вызов функции десмесьодх)з() для однозначного определения метода требует указания его имени, типа возвращаемого значения и списка типов аргументов.
Тип возвращаемого значения и типы аргументов задаются строкой буквенных символов следующего формата: "(спнсон типов аргументов)тнн воэврвс(венето эначеннн" Индикаторы типов, включаемые в эту строку перечислены в таблице 10.2. Таблица 10.2. Символы, применяемые в )(у! для кодировки типов возвращаемых значений и ар ментов методов для их обратного вызова Тнн лвнныв вэывв дача Нвянввтор аоо1еап вусе сьас эьосс зпк 1опд С1оак Сосъ1е чо16 Объект класса, укаэанного именем сзаввванв Мэссиз значений указанного типа сура ьс1аввпанвк [ суре (вгд (уре яв()ге(игп (уре метод с указанным в аср сура 11вс списком типов аргументов и возвращаемым значением типа твсисп сура Например, если методу передается один аргумент типа 1пв и один типа доиЬ1е и этот метод возвращает значение типа доиЬ1е, то определительная строка будет иметь такой вид: -(1П)П" "( (В1 Тече/1анд/Вех'1пдк )у" Приведенная далее последовательность команд выполнит следующие действия. Вначале команда доз скомпилирует исходный файл исЬокеувссо)сев.
дача в файл ИсЬоиеувссо)сев. с1авв, содержащий Уауа-код главной программы примера. Затем утилита дсдЬ считает полученный файл и создаст файл исЬокеувссо)сев. Ь, содержащий прототип (на языке С) системно-ориентированного метода. Далее будет выполнена компиляция исходного файла дее)сеувстоиев. с, содержащего реализацию этого метода на языке С, в объектный файл с перемещаемой адресацией кода (розй!оп !пдерелдел( соде) дес)сеувссокев.о. И в заключительной команде из объектного файла будет создана разделяемая (динамическая) библиотека 11Ьдее)сеун.во. Еще один пример: первый аргумент — массив байтов, второй аргумент — строка, тип возвращаемого методом значения — чохд: Глава 10.
Совмещение языков 21 3 с доз -с коьокеувсго)сев.зетгв а доз)т -зпз Ксьонеувгго)сев с дсс -ирьс -о деснеувсгокев.с -о дескеувсго)сев.о С дсс -вьегеб дее)сеувггонев.о -о 11)тдее)сеув.во Совмещение языков Гог1гап и С раблица 10.3. Совместимые типы данных языков С и Еогсгап Гвв взыев С Твв взыив восстал Оввовввв 8-битное целое число со знаком тб-битное целое число со знаком 32.битное целое число со знаком 32-битное число с плавающей точкой бп-битное число с плавающей точкой ФУнкция С, не имеющая возвращаемого значения, (коси гопстюп), эквивалент подпрограммы в языке роагап Возвращающая значение функция С зкзивалентнз функции языка гоагап в1ипаа анас вьогс 1етеоеР* 1 теткоке*2 теткокв саС 11оаС Саавте РООВЬЕ РЕЕС181ОВ зовкооттнквпв() чоса ець с) 11оас Скп <) весь Роесттов РОИ Ы В языке Уогггап аргументы всегда передаются ссылками на них, в языке С массивы всегда передаются через их адрес.