GCC - The Complete Reference (537669), страница 24
Текст из файла (страница 24)
Например, в следующей программе объединеиие, содержащее элемент типа боиЬ1е, приводится к типу ()оцЬ1е, затем программа обращается к каждому байту через ссылку на объединение: /* ип1опсаве.с */ $1пс1пае <всего.Ь> епзсп срагсв ( ппв1дпес сЬаг Ьусе[8) ОспЬ1е ЙЬ1( )' 1пе ха1п(1пе агдс,снах *агдя() ) ( 1пе 1( Оопнге уа1пе = З.14188; Еог(1=0( 1<8к ).++! [ рг1пЕЕ("Ъ02Х ",((ип1оп прагсв)уа1ие).Ьусе(1))( ) рг1пЕЕ("1п") ( геспгп(0); ) Приведение объединения также может быть использовано в качестве аргумента вызова функции: гс3л$ ргссип(пп).сп <)рагев)( репса((пп1сп срагев) уа1пе)к Приведение объединения несколько отличается от других приведений типов.
В действительности оно является конструктором и поэтому не может иметь значения Ьа!ие. Это делает ошибочными операторы подобные следующему: (пп1сп праге)уа1пе.аЬ1 = 1.2; (т оииакл( Глава б. Компиляция программ на языке С++ 109 Исходный код на ассемблере. файлы этого типа вырабатываются на промежуточном этапе компиляции. разделяемая (динамическая) объектная библиотека. (Зиагеб оЬ)ес( ИЬгагу,) Стандартные динамические библиотеки основного набора функций языка С++ имеют имена бвз суффикса.
<вове> Компиляция отдельного исходного файла в готовую к запуску программу В качестве примера вам предлагается исходный код простейшей программы на языке Сч-ч-, сохраните его в файле Ье11оъток1а. срр: /* Ье11оиок1а.срр */ Мьпс1пае <1овекеавг> 1пс гва1п(1пс акдс,сиас *ахов()! ( аеа:гсопс « "Ье11о, иог1атп"/ кеспкп(0)г ) Для выдачи отдельной строки на стандартное устройство вывода эта программа использует функцию соне, определенную в стандартном заголовочном файле 1оаетеазв. В готовую для запуска форму эта программа может быть скомпилироваиа следующей командой: б д++ Ье11оиок1а.срр Компилятор д++ распознает файл по суффиксу его имени как исходный файл на юыке Сч-ъ.
В соответствии с действующим предопределением он должен скомпилировать указанный исходный файл в объектный, далее скомпоновать объектный файл в готовую к запуску машинную программу, и затем удалить объектный файл. В связи с тем, что в командной строке не определено имя для выходного файла, по умолчанию будет создан файл с именем а. оис. Команда для запуска готовой программы и ее вывод выглядят так: 3 а.опе Ье11о, иосза ъ д++ ЬеНоиок1а.срр -о Ье11оиокта Ввод этого имени в командной строке приведет к выполнению программы: Ф Ьеззоиок1а, Ье11о, иок1а Программа д++ является особым вариантом утилиты дсс, она устанавливает Сч-+ в качестве основного языка компиляции, что приводит к автоматическому исполь- Имя для выполнимого системой файла, в который должен быть скомпилирован исходник, передается компилятору опцией -о.
По этой команде будет выработан файл с именем Ье11овгок1а: 1 10 часть!|. использование Сборного компилятора зованию стандартных библиотек языка С++ вместо применяемых по умолчанию библиотек языка С. При использовании соглашений об именах библиотек и указании соответствующей библиотеки в командной строке возможна компиляция и компоновка программы на языке С++ и командой дсс. Например, такой: 3 дсс Ье11оиог16.срр -1веос++ -о Ье11оиог1о Опция -1 Галь") заменяет следующее за ней имя, подставляя к нему префикс 11ь и суффикс . а„что превращает имя указанной библиотеки в 11ЬвМс++.а.
Затем поиск библиотеки с таким именем проводится в каталогах для стандартных библиотек. Дальнейший процесс компиляции и выходной файл точно соответствуют действию команды д++. На многих системах при инсталляции ОСС создается программа с именем с++. Ее использование вполне равносильно действию д++.
Вот пример такой команды; ь с++ Ье11оиог1о.срр -о Ье11оиог1о Преобразование нескольких исходных файлов в готовую к запуску программу Если в командной строке указывается несколько исходных файлов, то все они компилируются и компонуются вместе в один исполняемый файл. Далее — пример заголовочнного файла (Ьеа(]ег 6|е) с именем вреа]е. Ь, этот файл содержит определение класса, состоящего из одной единственной функции: /* вреа]е.Ь */ «1пс1ш]е <1овсгеаа> с1авв яреа]т ( риЬ11с: чо1о вауне11о(сопев сЬаг *); )' Далее — листинг файла вреа)е.
срр, содержащего код реализации функции вауне11о(): /* вреа]с.срр */ ()1пс1пае "вреа]т.Ь" чо16 Яреан:гвауне11о(сопвс сЬаг *всг) ( вго::сове « "Не11о " « вег « "Хп"/ ) Файл Ье11овреа]с. срр содержит программу, использующую класс яреайс /ь Ье11овреа]т.срр */ Я[пс1пое "вреа]с.Ь" 1пс ааьп(ьпс агяс,сЬаг *агдч[]) ( яреа]т вреакг ореад.ваУНе11о("иог1о")] геепгп(0)/ Глава 5. Компиляция программ на языке С++ 1 1 1 Для компиляции и компоновки этих трех файлов в единственный исполнимый файл используется одна команда; д д++ Ье11овреах.срр вреах.орр -о Ье11овреак Компиляция исходного кода в объектный Для компиляции исходного кода с подавлением компоновки и, соответственно, вывода объектного файла вместо исполняемого применяется опция -с.
По умолчанию имя вырабатываемого файла совпадает с именем исходного, только имеет суффикс .о. Например, по следующей команде исходный файл Ье11овреак. срр будет скомпилирован в объектный файл Ье11овреаи. о: Ф д++ -с Ье11овреах.срр Программа д++ также распознает файлы с суффиксом . о в качестве входных и передает нх компоновщику (Брег): 3 д++ -с Ье11овреах.срр В д++ -с вреах.срр 3 д++ Ье11овреах.о вреак.о -о Ье11овреах Следует заметить, что опция -о используется не только для присвоения имен исполняемым файлам.
Ее также можно использовать для назначения имен и другим выходным файлам компилятора. Например, в результате следующей последовательности команд будет создан тот же файл с исполняемым кодом, что и в предыдущем примере. С той лишь разницей, что имена промежуточных объектных файлов будут другими: д д++ -с Ье11овреах.срр -о Ьври1.о 3 д++ -с вреах.срр -о верха.о 3 д++ Ьврх1.о Ьвркз.о -о Ье11овреах Предобработка Назначение опции -и указывает драйверу д++ пропустить исходный код через препроцессор СРР и не производить никаких дальнейших действий.
По следующей команде будет выполнена последовательная предобработка исходного кода из файла Ье11омох1б. срр и выдача результата предобработки на стандартное устройство вывода; 3 д++ -Е Ье11омог1о.срр Исходный код программы в файле Ье11омох16. срр состоит всего из шести строк и зта программа только и делает, что выводит строку текста. Но на выходе препронессора будет более 1200 строк. Так много потому, что будет включен заголовочный файл фовехеагя. Ь, а он, в свою очередь, включит в код еще несколько заголовочных файлов. В них определяется несколько больших классов, отвечающих за ввод и вывод.
1 12 часть|1. использование Сборного компилятора Суффикс имени файла, принятый в ОСС для результатов предобработки — . 11. Такой файл может быть выработан при использовании опции -о, как в следующем примере: В дсс -и Ье11оиот1о.срр -о Ье11оиот1<).11 Выработка компилятором ассемблерного кода Опция -В указывает компилятору сгенерировать код на языке ассемблера и на этом остановиться. Следующая команда создает файл с именем Ье11оегог16.
в с ассемблерным кодом из исходного файла на языке С++: В д++ -В Ье11оиог1д.срр Выработанный ассемблерный код зависит от типа целевой платформы. Если вы будете просматривать полученный в результате такой компиляции код, то увидите в нем не только выполняемые инструкции и определения данных, но также и адресные таблицы, необходимые для обеспечения наследования и компоновки программ на языке С++. Создание статической библиотеки Статическая библиотека (з(а(!с ИЬгагу) — это архивный файл, содержащий набор выработанных компилятором объектных файлов.
Составляющие библиотеку части могут содержать применяемые функции, определения классов и объекты, являющиеся вхождениями экземпляров ()пмапсез) определений классов. В действительности все, что может содержаться в объектном файле с суффиксом . о, может быть помещено в библиотеку. В следующем примере создаются два объектных модуля, используемые затем для составления статической библиотеки. Заголовочный файл (Ьеа((ег й)е) содержит необходимые программе функции, определения классов и объекты. Заголовочный файл вау. Ь содержит прототип функции вауне11о ( ) и определение класса с именем Вау. Далее приводится содержимое этого файла: /* вау.Ь */ $1пс1п<)е <(овсгеав> то1гз вауЬе11о(то16)г с1авв Вау ( рг(тасе: сЬат *вст1пдг рпЬ1(с: Вау(сЬат "всг) ( вег(пд = вег) ) то(о ваутЬ(в(сопвс сЬаг *всг) ( вссг:свис « всг « " тгош а всат(с 1(Ьгагу1п'Ы ) то1<) ваувсг(пд(тоьо)г Глава б.
Компиляция программ на языке С++ 1 1 3 Следующий файл с именем в ау. срр — исходник первого из двух объектных модулей, которые должны быть помещены в библиотеку. В нем содержится тело определения функции в ауяег1пд ( ) класса Зау. Также он содержит объявление объектаз 11Ьгагувау, который является экземпляром класса Зау: /* вау.срр */ «застаете »вау.Ь" возгт Зау::ваувег1пд() ( вгг]::свис « вег1пд « »1п") ) Зау ].1Ьтвтувау("Ь1Ьгагу 1пвеапсе от Зву»)) Файл вауЬе11о. срр содержит исходный код второго модуля, который также должен быть помещен в библиотеку.
В нем находится определение функции вауЬе11о(): /* ввуЬе11о.срр */ Взпс1игте "вазг.ь» гоЫ вазгЬе11о() ( всцг:соме « "Ье11о тгоа а всас1с 11Ьгату1п"; ) Приведенная далее последовательность команд выполняет компиляцию двух исходн]ях файлов в объектные и затем сохраняет их с помощью утилиты аг в статической библиотеке: 3 д++ -с ваУЬе11о.срр 3 д++ -с вау.срр 3 ат -г 11Ьвау.в вауЬе11о.о вву.о Утилита аг, использованная с опцией -г, создает новую библиотеку с именем 11Ьвау. а и помещает в нее перечисленные в команде объектные модули. При таком способе применения аг создает новую библиотеку с указанным именем, если таковой еще не существует. При наличии указанной библиотеки утилита аг заменяет в ней существующие объектные модули их новыми версиями. Далее — содержимое главного исходного файла программы вазпвайп.
срр, использующей статическую библиотеку 11Ьвау. а: /» ваува1п.срр */ $1пс1пгте »вау.Ь» [пс аа1п(1пе агдс,сЬаг *атдч[]) ( ехсегп Зву 11Ьгвгувау[ Зау 1осв1вау = Зву(»ъосв1 1пвевпсе от Зау")г вауЬе11о()к 11Ьгагувау.ваутЬ1в("Ьоиду»); 11Ьгвгувау.ваувсг1пд(); 1оса1вау.вауяст1пд(); геепгп(0); ) 1 14 Часть И. Использование Сборного Компилятора Эта программа компилируется и компонуется приведенной далее командой. В команде определяется, что драйвер верхнего уровня компилятора д++ разрешает все внешние ссылки, имеющиеся в ваутва1п.срр, через поиск определений для требуемых символических имен в библиотеке 11Ьвау. а: 3 д++ вауаахп.срр 11Ьвау.а -о вауаазп Внешнее отношение к 11Ьгагувау ссылается на объект, объявленный в 11Ъвау.