Главная » Просмотр файлов » GCC - The Complete Reference

GCC - The Complete Reference (537669), страница 22

Файл №537669 GCC - The Complete Reference (GCC - The Complete Reference) 22 страницаGCC - The Complete Reference (537669) страница 222015-07-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 22)

° Некоторые функции не могут быть расширены подстановкой. Среди таких— функции, использующие переменное количество аргументов, а11оеа, массивы переменной длины, удаленные (не локальные) переходы по доео, а также имеющие вложенные функции. Также возникают сложности в рекурсивных и имеющих ссылки на собственный адрес функциях. Опция командной строки -тгйп1йпе вьшает предупреждения во всех случаях невозможности подстановки кода функций, объявленных как Ьп1йпе.

° В программах на языке С стандарта "1Ю С" вы можете использовать ключевое слово 1пххпя вместо 5л1з.пе. ° Можно использовать опцию командной строки -Ейп1Ые-йцпсейопв для предоставления компилятору возможности самостоятельно принимать решение о применении подстановки для функций, отвечающих действующим для этого условиям. ° Если )п11пе-функция не объявлена как статическая (майе), то объектный код ее тела все-же должен быль сгенерирован компилятором на случай вызова этой функции из другого модуля. Объявление функции одновременно как 1п11пе, так и веаейе, приведет к тому, что она будет подстанавливаться во всех случаях, поэтому отдельный объектный код для нее вырабатываться не будет. Опция -й1кеер-Ьп1йпе-йцпес1опв замещает это правило и тогда тело функции всегда создается.

° Объявление функции в заголовочном файле (Ьеадег В1е) одновременно как ехеегп, так и Ьп1хпе — почти то же самое, что и определение макроса. Другая копия той же функции (без квалификаторов ехеегп и Ьп11пе) может быть скомпилирована и сохранена в объектной библиотеке так, что будут разрешимыми все ссылки на нее, не расширяемые подстановкой. Имена функций (Г<псбоп Навей) идентификатор вчпястхоп содержит имя той функции, в которой он применяется. Имя представляется в форме строки буквенных символов и может соединяться с другими строками точто так же, как значения яхье или ь|МБ Следующий пример оператора собирает в одной строке текст с информацией о своем расположении в исходном коде, используя все три этих макроса: еъяк *пеке = "ЬХпе " ЬХИЕ " ок " яхья " кп " гпЕОТХОЕ г 98 Часть и.

Использование Сборного Компилятора Опубликованный в стандарте )БО С99 идентификатор тппс также содержит имя текущей функции, но только в виде массива символов (аггау ог" с))аг), а не строки буквенных символов. Семантика рписттои считается более не актуальной, планируется изменеяие этого встроенного идентификатора — приведение его в соответствие семантике гипс В языке С идентификатор рииттт вчпчсттОИ содержит то же значение, чта и р()истхОИ, но следует учитывать, что в языке С++ их содержимое отличается по форме представления. Использование вложенных функций (Гыпсбоп йей~ад) Функции могут вкладываться друг в друга.

Внутренняя функция может быть вызвана только в пределах родительской функции. Следующий пример функции содержит вложенную функцию с именем гап61пе (), возвращающую псевдослучайное целое число в заданных пределах: чгеге гапдеге() ( 1пе гапЖпс(1пс 1ои,1пе Ь1д)з) ( геепгп(((1пг)гапеоп() $ (п1дЬ-1очг+1)) + 1очг) ) рг1псг("0 Со 1001 Эмтхп",гапе1пс(0,100)]( рггпсе("5 го 10в зех1п",гапг(1пс(5,10))( рггпег(ч-1 Ео 1: эег(1п",гап((1пг(-1,1))г При применении вложенных функций действуют следующие правила: ° Вложенная функция создает свой стэк примерно таким же образом, как и переменные. Поэтому она может быть объявлена в блоке (перед первым исполняемым оператором блока) — в том же месте, где объявляются локальные переменные.

° Адрес вложенной функции не может быть передан вызывающей родительскую функцию структуре. Как и любая другая локальная переменная, вложенная функция исчезает после того, как родительская функция возвращает управление. ° Встроенная функция не может быть вызвана извне. ° Внутри родительской функции возможна передача адреса встроенной функции другой функции и возможен вызов ее оттуда. Так же, как в пределах функции возможно обращение по адресу к ее любой локальной переменной.

° Встроенная функция имеет прямой доступ к тем же переменным, что и родительская. Глава 4. Компиляция программ на языке С 99 ° Локальные переменные доступны встроенной функции лишь если они объявлены перед ней. ° Встроенная функция может использовать переход по оператору посо на внешние метки, но только в пределах родительской функции. ° Прототип встроенной функции может объявляться с ключевым словом аисо, см. пример: зо16 г1дЬС[) ( аиго ((оиЬ1е Ьурозепиве()[ [(оиЬ1е а = 3. 0[ ((о Ь1е Ь = 4.О; ооиЬ1е Ьурозепиве([(оиЬ1е х,ооиЬ1е у) ( гееигп[вдгс(х * х + у * у))к ) рггпсс(юьопд вз((е ог кззг апа кз1т 1в кз1ГХп, а,Ь,Ьуроеепиве(а,Ь))[ Прототипы функций (Гцпсбоп Рго1о1урез) Новое определение прототипа функции замещает действующее определение любой функции только при сохранении ранее объявленного списка аргументов. Вот пример корректного замещения, аргумент короткого целочисленного типа автоматически расширяется до полного целочисленного при вызове функции: (пз сг1дзео[1пс зуа1ие)к 1пз сг1дзе[((зуа1ие) въогс зуа1иек ( гесигп(зуа1ие == 0) ) В случае объявления с новым синтаксисом 1пс сг1дгеб(впогс гзга1ие), компилятор будет выдавать сообщение об ошибке из-за конфликта между типами аргументов йпс и впогс.

Адреса возврата из функций и кадры стэка (Гипсбоп йеШгп Адгеяез апд йасЕ Ргатез) Существует встроенная функция, используемая для получения адреса, который используется функцией для выполнения возвращения в вызывающую ее конструкцию: тоъа з Ьи11с1п гесигп а[(геев (ипв1дпео 1пс 1ете1) Указывая значение 1еуе1 равное нулю„мы получаем адрес возврата, используемый текущей функцией. При значении 1еуе1 равном 1 — адрес возвращения, действующий в той функции, из которой была вызвана текущая функция; значении д— 100 Часть!1. Использование Сборного Компилятора адрес возвращения из внешней функции следующего уровня (второго по отношению к текущей). И так далее — до тех пор, пока весь стэк вызова не будет исчерпан.

функция Ьп11Ь1п квсикп абкевв() можетприменятьсядля расчетаглубины стэка вызова. Учтите, что 1ача1 должен передаваться только как константа, не как переменная. В некоторых системах нет возможности получения адресов возврата никаких функций, кроме текущей. В зависимости от особенностей платформы на таких системах получаемое значение адресов (для 1ача1 = 1 и выше) равно нулю либо имеет случайное значение. Следующая встроенная функция используется для получения адреса кадра стэка функции (з(ас)т (гап]е ат)гезз): ЧОЫ в ЬП11Е1П Гтаиа абтааа (ЕПВ1диаб 4ПЕ 1ВЧа1] Идентификаторы (! депбйегь) Идентификаторы могут содержать знак доллара ("б").

Это необходимо для совместимости со многими традиционными компиляторами С и также связано с большим объемом используемых программ на языке С, имеющих имена переменных и функций со знаком доллара. Использование знака доллара допустимо не для всех систем, некоторые ассемблеры его не воспринимают. Целые числа (! п1еяел) Стандартом ")БО С99" определены целочисленные типы длиной более 64 бит. Компилятор ОСС поддерживает их, начиная с более ранних версий языков С и С++. Вот примеры объявления таких типов: 1опд 1опд 1пе ат ппв1дпаб 1опд 1опд 1пе Ь! // Цепов 64 бит со знаком // цапов 64 бит баз знака Могут также объявляться константы любого из этих типов: а = 855ъьт Ь = 855ОЪЪт // целочисленная константа 64 бит со знаком // целочисленная константа 64 бит без знака Указывая 1ачв1 равный нулю, мы получаем адрес кадра стаха текущей функции.

1еча1 равный 1 — адрес кадра стэка функции, из которой была вызвана текущая. При значении г — адрес кадра стэка следующей внешней функции, и так далее, пока небудетисчерпанвесьстэквызова. Встроенная функция ьп11с4п 5кшаа а()кавв() может быть применена для нахождения глубины стека вызова. Кадр с/лака — это блок памяти, содержащий значения регистров, сохраненные вызываемой функцией, и значения аргументов, передаваемых функции. Точный формат кадра зависит от применяемых для вызова функций соглашений и от платформы. На некоторых системах не существует возможности получения адресов каров стэка функций выше текущего уровня. В таких случаях при указании 1еча1 больше нуля рассматриваемая встроенная функция возвращает нулевое значение адреса.

Также возвращается нулевой адрес и в случаях, когда 1ача1 превышает глубину стэка вы-, зова. Глава 4. Компиляция программ иа языке С 10 1 Арифметические операции сложения, вычитания и Булевы битовые операции мо>уг производиться над этими типами на любых машинах. А умножение, деление в битовые сдвиги поддерживаются не на всяком оборудовании и могут требовать использования особых библиотечных подпрограмм. Важно использовать прототипы с определениями соответствующих типов аргументов, если вы намерены использовать их в аргументах вызова функций.

Без прототипа размер и положение переменных в стэке вызова может оказаться неправильным. Альтернативные формы ключевых слов (Кеуаоп1 Айеи~а1еь) Опции командной строки -ясй и -алеф исключают использование ключевых слов аяв, суреой и йп11пе, однако возможно использование их альтернативных форм аев , суреой и фл11пе Адреса меток (~аЬе! Айеыеь) Существует возможность получения адреса метки, сохранения его в указателе и последующего перехода на нее по оператору досо с этим указателем. Адрес может быль получен оператором йй и сохранен в указателе на элемент данных (чоЫ ро! п(ег). Вот вам пример, показывающий как это можно сделать: ! докой Ыг.с / Мпс1п<те <ясно.и> ятпс1и<)е <С1ве. Ь> 1пс ва1п(1пс егдс,спаг >егдч[) > ( чо1<З *сегдес> с1ве с пои> пои = С1ве( (С1ве С *)НПЬЬ) 1Е(пои й ОгООО1> сагдес ййо<Ысадг е1ве сагяес = ййечепсед> доео *сагдес; ечепседг рг1псг("Т)>е с1ве че1ие г>1<1 1я ечепхп",пои)г гееогп(0>г о<Ысед г ргьпсг ("т)ге сьве ча1ие <ь1<1 1а о<)бхп",пои) г геспгп(0)г ) Псевдослучайное число использовано для принятия решения, адрес которой из меток будет сохранен в сагдес.

Характеристики

Тип файла
DJVU-файл
Размер
6,08 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6314
Авторов
на СтудИзбе
312
Средний доход
с одного платного файла
Обучение Подробнее