GCC - The Complete Reference (537669), страница 28
Текст из файла (страница 28)
В ОЬУес(1 е-С добавлена поддержка классов, иногда его называют "языком С с объектами". Если применить другую распространенную точку зрения, ОЬ(ест(те-С вЂ” результат объединения языков С и аглай(айб 01уесг(те-С намного проще, чем язык С++. Реализация ОЬ(есг(те-С в ССС представляет собой ничего более чем язык С с добавлением в него синтаксиса определения и применения классов, создания экземпляров объектов и передачи объектам сообщений (т.е. вызова методов). При передаче объектам сообщений используются правила, весьма близкие к применяемым в языке ВтаП(айс В отличие от других компилирумых в бСС языков ОЬ)ест(ве-С не имеет стандартного определения.
Реализация в ССС языка ОЬ)ест(те-С довольно сходна с версией этого языка, разработанной для системы )ч)еХТВ(ер. Базовая компиляция В таблице б.! приводится список типовых суффиксов имен файлов, применяемых при компиляции и компоновке (!ш)с)пя) программ на языке ОЬ)есг(ке-С. Полный список распознаваемых ОСС суффиксов приведен в приложении Г Таблица 6.1. Суффиксы имен файлов, связанных с компиляцией ОЬ)есг)ке-С Библиотека (архивный файл), содержащий объектные файлы для статической компоновки.
Нкпючаемый в программы заголовочный файл (Ьеабег б)е). Исходный файл на языке ОЬ)водке-С, подлежащий обработке препроцессором. исходный файл на языке Оь)волке-с, не подлежащий предобработке, 128 Часть и. Использование Сборного Компилятора Объектный файл в поддерживаемом компоновщиком формате. разделяемая (динамическая) библиотека, которая содержит объектные файлы, пригодные для динамической компоновки (Оупапнс 1(пыпд) во время выполнения программы.
ло Компиляция отдельного исходного файла в готовую к запуску программу Программа на языке ОЬ/ест/уе-С может быть написана в соответствии с правилами синтаксиса в формате программы на языке С. Это означает, что листинг программы на ОЬ/есг/уе-С, не используюшей объектов, мало чем отличается от листинга такой же программы на языке С. Далее вам предлагается пример простейшей программы, которая может быть скомпилирована как программа на языке ОЬ/еспуе-С и запушена на выполнение. /* Ье11оиог1б.а */ Мзшрогс <всс1о.Ь> 1пе вазп(1пс агдс,сЬаг яагдчт()) ( рг1пгб("Ье11о, ыог1тттп")) гесигп(о)) ) ъ дсс -иьо-1арогг Ье11оыог1б.ш -1оьзс -о ье11оыог16 Опция -вгьо-1)врогг нужна здесь для подавления предупредительных сообщений об использовании $1втрогс вместо Мфпс1итте для включения в программу кода из заголовочных файлов (Ьеа()ег В(ез). Имея исходники ОСС, вы в состоянии изменить соответствующую установку по умолчанию в файле срр1п1с.
с, закоментировав в этом файле следующую строку кода: свв саттон (рг11е, иагп 1арсгс) = 1; Опция -1оЬЗ с Указывает, что пРи компиляции должна быть использована библиотека 11ЬоЬЗ с. а (основная библиотека языка ОЬ/ес(/уе-С). Но именно для нашего примера нет необходимости в ее применении, потому что в коде этой простейшей программы поддержка объектов не используется. Компилятор определяет, что передаваемый ему файл содержит исходный код на языке ОЬ/ест(уе-С, по суффиксу име- Программа почти во всем соответствует такой же программе на языке С, кроме использования директивы препроцессора й1тврогс вместо директивы Мйпс1ибе. Обе директивы применяются для одной и той же цели, только ййвтрогс имеет дополнительное удобство. Удобство состоит в том, что заголовочный файл по этой директиве подключается только однажды в пределах отдельного компилируемого модуля.
Тот же эффект при использовании м1ьс1и((е достигается применением директив условной компиляции, как это описано в главе 3. Вы можете выбрать наиболее удобный для вас способ. Приведенная программа может быть скомпилирована следуюшей командой: Глава 6. Компиляция программ на языке ОЬ)ес()че-С 129 ив файла .та. Опция -о назначает имя выходному файлу. По умолчанию выходному фзйлу выполнимого формата было бы присвоено имя а. оие.
Компиляция программ, использующих объекты Определения классов обычно содержатся в двух исходных файлах. Язык ОЬ/ес//яе- С предусматривает, что в заголовочном файле с суффиксом . Ь содержится интерфейсное определение ()п(егуасе деГ)п1()оп) класса и в другом — исходном файле с суффиксом .та — содержится код реализации (ппр)егпеп(айоп) методов этого класса. В предлагаемом примере в файле Зреа)к. Ь определяется интерфейс класса Зреа)к, способного хранить символьную строку и по запросу выдавать ее на стандартное устройство вывода: / Зрея)к.Ь / $)ятрсгг <сЬЗс/ОЬЗесГ.Ь> З1пееггасе Зреа)к: ОЬэесе ( сЬаг «вгг1пдг ) — весаггТпдт (сЬаг *) вег/ вау' - Егеет Зевс Директива ()Звтрогс применена для включения кода из заголовочного файла ОЬ)есе.
Ь, который содержит интерфейсное определение базового класса ОЬ> есе. Класс ОЬ3 все является верхним (родительским) классом для всех пользовательских кпассов в программах на языке ОЬ/ест)ве-С. Определение класса зреа)к окружено директивами компилятору 91пеегйасе и кепс). Внутри этого определения находится выделенный фигурными скобками блок, где находятся определения данных класса Зреа)с.
В этом примере определяется единственный элемент данных — указатель на символьную строку. За блоком данных следует список методов этого класса. Опреаеаение каждого метода имеет следуюц(ий синтаксис: символ "минус" ("-«), имя метода и затем — список имен передаваемых ему аргументов (если есть таковые), Код реализации методов класса Зреа)к содержится в файле Зреа)к.зс /* Зреа)к.а «/ $)тярогг "Зреа)к.Ь" З)ззр1ешепсагьоп Зреа)к + пем ( ве1г = (впрег пем)т (ве1г вегагг1пд: гесагп ве1гт ) - вееаеггпд: (сЬаг «)вег ( вег1пд = вегт гегпгп ве1гт ) - вау зкг фф 1 30 Часть и.
Использование Сборного Компилятора ргьпсЕ ("Ъвхп", всг1пд); гесигп ве1Е/ ) - Егее ( геепгп [вирег Егее); Код заголовочного файла Зреа)с. Ь включается в программу препроцессором, поэтому все определения данных и методов будут доступны программе. Директива компилятору 91шр1ешепсасйоп указывает„что этот файл, Яреа)с.ш, содержит код реализации (ппр[етеп(а(!оп) методов класса Зреа)г, объявленного в файле Зреа)с.Ь. Тело кода реализации того метода, перед именем которого стоит знак "минус", является реализацией соотвестствующих методов экземпляров объекта.
Обращение к ним возможно только тогда, когда объект уже существует. А те методы, код реали зации которых стоит после знака "плюс" ("+"), являются методами класса и могут быть вызваны в любом месте программы. Сигнатура метода в коде его реализации должна соответствовать интерфейсному определению этого метода в заголовочном файле. Она дополняется кодом тела метода, заключенным в фигурные скобки. Несмотря на то, что метод может возвращать определенные в его объявлении типы данных, его результат кроме того включаетдонолнительный тип 1т( (тип данных, представляющий в языке О(уес//те-С принадлежность к объекту). Благодаря тому, что методы объекта по большей части возвращают указатель веХЕ, объект таким способом ссылается сам на себя.
Следующая программа Ье11ооЬ1еос.ш использует объект Зреа)с для вывода на стандартное устройство вывода строки ')теНо, ттогЫ": /* Ье11оов~есс.ш */ ()1шрогс <оЬ5с/оЬ5еее.Ь> ()1шроге "ареал.Ь" шаьп() ( 1(( вреавг вреаа = [Зреах пеш)г [вреаа весаггьпд: "Ье11о, ног1о") [вреаи вау1; [вреаи Егее]г Зта программа может быть скомнилироваиа последовательной компиляцией каждого из исходных файлов в объектный код И послеДующей компоновкой полученных обьектных файлов. То есть таким набором команд: $ део -Мпо-1шрогг -о Ье11ооЬ5еое.ш -о Ье11ооЬ3еее.о 3 дсс -ипо-1шрогс -о Зреаа.ш -о Зреах.о 3 дес Ье11ооЬ5еог.о Зреах.о -1овзо -о Ье11оовэеог Или же можно применить одну команду, выполняющую все три действия: 3 део -ипо-1шрогс ье11ооьзеос.ш зревк.ш -1оь5о -о ье11ооьзеос Глава 6. Компиляция программ на языке ОЬ!ес(ые-С 1 3 1 Создание и использование статической библиотеки Набор объектных файлов с суффиксом .
о, вырабатываемых при компиляции исходного кода на языке ОЬ/ес)те-С может сохраняться в библиотеке (архиве) объектных файлов. В следующем примере создается библиотека с именем 11Ьсае. а, которая содержит код реализации (ппр)егпеп1а1юп соде) класса с именем Сас. Класс имеет методы, которые принимают последовательность символьных строк и объединяют их в одну строку. Файл саь. Ь является заголовочным файлом на языке ОЬ/есг/ге-С, содержащим интерфейсное определение класса Сат:. /* Сае.Ь */ Иъврогс <пас/ОЬЗесг.Ь> И[пеегтасе Саг г Олесь ( сиаг «вег1пд) ) - асов (сиаг ') вег) (сцаг *) деея - 1п1ег - егеег аеас Файл саь.в содержит код реализации (ппр[егпеп1абоп) класса сат.. метод асы используется для добавления символьных строк в конец строки и метод де с — для получения текущей объединенной строки. Метод-конструктор 1п1с вызывается для сщдания нового объекта — экземпляра класса Саги /* Сае.в */ И1вроге "Саг.и« Иьвр1евепеае1оп Саг + пеи ( ве11 = [впрег пем) (ве11 1п1Е) г геепгп ве11) ) - 1п1е ( вег1пд иоььг гегпгп ве11г ) - аас: (сиаг «) вгг ( 1пе 1епдеЬ) сцаг *пеивег1пдг 11(вег1пд == ноьь) ( 1епдгь = вег1еп(вег) + 1) вгг1пд (сиаг «)ва11ос(1епдЕЬ) вегсру(вгг1пд,вгг)г 132 Часть [1.