Главная » Просмотр файлов » Керниган и Ритчи - Язык программирования Си

Керниган и Ритчи - Язык программирования Си (793773), страница 55

Файл №793773 Керниган и Ритчи - Язык программирования Си (Керниган и Ритчи - Язык программирования Си) 55 страницаКерниган и Ритчи - Язык программирования Си (793773) страница 552019-04-24СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Если список-типов-параметров не состоит из одного-единственного слова void,показывающего, что параметров у функции нет, то в каждом объявителе в списке-типов-параметров обязанприсутствовать идентификатор. Если список-типов-параметров заканчивается знаками", ...", то вызовфункции может иметь аргументов больше, чем параметров; в таком случае, чтобы обращаться кдополнительным аргументам, следует пользоваться механизмом макроса va_arg из заголовочного файла<stdarg.h>, описанного в приложении В.

Функции с переменным числом аргументов должны иметь покрайней мере один именованный параметр.Вторая форма — определение функции старым способом. Список-идентификаторов содержит именапараметров, а список-объявлений приписывает им типы. В списке-объявлений разрешено объявлять толькоименованные параметры, инициализация запрещается, и из спецификаторов класса памяти возможен толькоregister.И в том и другом способе определения функции мыслится, что все параметры как бы объявлены в самомначале составной инструкции, образующей тело функции, и совпадающие с ними имена здесь объявляться недолжны (хотя, как и любые идентификаторы, их можно переобъявить в более внутренних блоках).Объявление параметра "массив из типа" можно трактовать как "указатель на тип"; аналогичнообъявлению параметра объявление "функция, возвращающая тип" можно трактовать как "указательна функцию, возвращающую тип".

В момент вызова функции ее аргументы соответствующим образомпреобразуются и присваиваются параметрам (см. А7.3.2).Новый способ определения функций введен ANSI-стандартом. Есть также небольшие изменения воперации повышения типа; в первой версии языка параметры типа float следовало читать какdouble. Различие между float и double становилось заметным, лишь когда внутри функциигенерировался указатель на параметр.Ниже приведен пример определения функции новым способом:int max(int a, int b, int с){int m;m = (a > b) ? a : b;return (m > с) ? m : с;}Здесь int — спецификаторы-объявления; max(int a, int b, int с) — объявитель функции, а , .

. . — блок, задающий ее код. Определение старым способом той же функции выглядит следующим образом:int max(a, b, с)int a, b, с;{/* ... */}где max(а, b, с) — объявитель, a int a, b, с — список-объявлений для параметров.А 10.2. Внешние объявленияВнешние объявления специфицируют характеристики объектов, функций и других идентификаторов. Термин"внешний" здесь используется, чтобы подчеркнуть тот факт, что объявления расположены вне функций;впрямую с ключевым словом extern ("внешний") он не связан. Класс памяти для объекта с внешнимобъявлением либо вообще не указывается, либо специфицируется как extern или static.В одной единице трансляции для одного идентификатора может содержаться несколько внешнихобъявлений, если они согласуются друг с другом по типу и способу связи и если для этого идентификаторасуществует не более одного определения.Два объявления объекта или функции считаются согласованными по типу в соответствии с правилами,рассмотренными в А8.10.

Кроме того, если объявления отличаются лишь тем, что в одном из них типструктуры, объединения или перечисления незавершен (А8.3), а в другом соответствующий ему тип с тем жетегом завершен, то такие типы считаются согласованными.

Если два типа массива (8.6.2) отличаются лишьтем, что один завершенный, а другой незавершенный, то такие типы также считаются согласованными.Наконец, если один тип специфицирует функцию старым способом, а другой — ту же функцию новымспособом (с объявлениями параметров), то такие типы также считаются согласованными.Если первое внешнее объявление функции или объекта помечено спецификатором static, то объявленныйидентификатор имеет внутреннюю связь; в противном случае — внешнюю связь.

Способы связейобсуждаются в А11.2.Внешнее объявление объекта считается определением, если оно имеет инициализатор. Внешнее объявление,в котором нет инициализатора и нет спецификатора extern, считается пробным определением. Если вединице трансляции появится определение объекта, то все его пробные определения просто станутизбыточными объявлениями. Если никакого определения для этого объекта в единице трансляции необнаружится, то все его пробные определения будут трактоваться как одно определение с инициализатором0.Каждый объект должен иметь ровно одно определение. Для объекта с внутренней связью это правилоотносится к каждой отдельной единице трансляции, поскольку объекты с внутренними связями в каждойединице уникальны.

В случае объектов с внешними связями указанное правило действует в отношении всейпрограммы в целом.Хотя правило одного определения формулируется несколько иначе, чем в первой версии языка, посуществу оно совпадает с прежним. Некоторые реализации его ослабляют, более широко трактуяпонятие пробного определения. В другом варианте указанного правила, который распространен всистемах UNIX и признан как общепринятое расширение стандарта, все пробные определенияобъектов с внешними связями из всех транслируемых единиц программы рассматриваются вместе, ане отдельно в каждой единице.

Если где-то в программе обнаруживается определение, то пробныеопределения становятся просто объявлениями, но, если никакого определения не встретилось, то всепробные определения становятся однимединственным определением с инициализатором 0.А 11. Область видимости и связиКаждый раз компилировать всю программу целиком нет необходимости. Исходный текст можно хранить внескольких файлах, представляющих собой единицы трансляции.

Ранее скомпилированные программы могутзагружаться из библиотек. Связи между функциями программы могут осуществляться через вызовы ивнешние данные.Следовательно, существуют два вида областей видимости: первая — это лексическая областьидентификатора: т. е. область в тексте программы, где имеют смысл все его характеристики; вторая область —это область, ассоциируемая с объектами и функциями, имеющими внешние связи, устанавливаемые междуидентификаторами из раздельно компилируемых единиц трансляции.А 11.1. Лексическая область видимостиКаждый идентификатор попадает в одно из нескольких пространств имен. Эти пространства никак не связаныдруг с другом. Один и тот же идентификатор может использоваться в разных смыслах даже в одной областивидимости, если он принадлежит разным пространствам имен.

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

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

Таким образом, одно и то же имя может использоваться в нескольких различныхструктурах. Это правило широко применяется уже несколько лет.Лексическая область видимости идентификатора объекта (или функции), объявленного во внешнемобъявлении, начинается с места, где заканчивается его объявитель, и простирается до конца единицытрансляции, в которой он объявлен. Область видимости параметра в определении функции начинается сначала блока, представляющего собой тело функции, и распространяется на всю функцию; область видимостипараметра в описании функции заканчивается в конце этого описания.

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

СвязиЕсли встречается несколько объявлений, имеющих одинаковый идентификатор и описывающих объект (илифункцию), то все эти объявления в случае внешней связи относятся к одному объекту (функции) —уникальному для всей программы; если же связь внутренняя, то свойство уникальности распространяетсятолько на единицу трансляции.Как говорилось в А10.2, если первое внешнее объявление имеет спецификатор static, то оно описываетидентификатор с внутренней связью, если такого спецификатора нет, то — с внешней связью.

Еслиобъявление находится внутри блока и не содержит extern, то соответствующий идентификатор ни с чем несвязан и уникален для данной функции. Если объявление содержит extern и блок находится в областивидимости внешнего объявления этого идентификатора, то последний имеет ту же связь и относится к томуже объекту (функции). Однако если ни одного внешнего объявления для этого идентификатора нет, то онимеет внешнюю связь.А 12. ПрепроцессированиеПрепроцессор выполняет макроподстановку, условную компиляцию, включение именованных файлов.Строки, начинающиеся со знака # (перед которым возможны символы-разделители), устанавливают связь спрепроцессором. Их синтаксис не зависит от остальной части языка; они могут появляться где угодно иоказывать влияние (независимо от области видимости) вплоть до конца транслируемой единицы.

Границыстрокпринимаются во внимание; каждая строка анализируется отдельно (однако есть возможность"склеивать" строки, см. А12.2). Лексемами для препроцессора являются все лексемы языка ипоследовательности символов, задающие имена файлов, как, например, в директиве #include (А12.4).Кроме того, любой символ, не определенный каким-либо другим способом, воспринимается как лексема.Влияние символов-разделителей, отличающихся от пробелов и горизонтальных табуляций, внутри строкпрепроцессора не определено.Само препроцессирование проистекает в нескольких логически последовательных фазах. В отдельныхреализациях некоторые фазы объединены.1.

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

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

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

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