Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 58

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 58 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 582018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Даже в реализациях с оптимизированной обработкой заголовков, такое нежелательно, ибо может сильно увеличивать время компиляции и засоряет глобальную область видимости объявлениями и макросами. Последнее может оказать непредсказуемое влияние на смысл программы.

Заголовочные файлы следует использовать лишь тогда, когда в этом есть действительная необходимость. 9.4. Программы Программа состоит из множества раздельно компилируемых единиц, собираемых воедино компоновщиком. Кзждая функция, объект, тип и т.п. должен иметь уникальное определение в рамках этого множества Я4.9, 99.2.3).

В программе должна быть единственная функция юи(и() 53.2). Вычислительная активность программы начинается в функции та(и () и завершается по выходу из этой функции. Возвращаемое этой функцией целое значение передается программному загрузчику в качестве результата работы программы. Рассмотренная простая схема получает дополнительные детали в программах, содержащих глобальные переменные (910.4.9), или в программах, генерирующих неперехватываемые исключения (514.7). 9.4.1. Инициализация нелокальных переменных В принципе, любая переменная, определяемая вне функции (в глобальном пространстве, в именованном пространстве имен, в качестве статического члена класса), инициализируется до вызова та(и () .

Порядок инициализации таких переменных соответствует порядку их определения в единице трансляции 510.4.9). Если явные инициализаторы отсутствуют, то переменные инициализируются умолчательными значениями, характерными для их типов данных (510.4.2). Умолчательное значение для встроенных типов и перечислений равно нулю. Например: поные х=2; ~У нелокальные переменные йоиЫе у; «(оные лохгере! (х»у); В этом примере нелокальные переменные х и у инициализируются раньше, чем переменная еох, так что при инициализации последней вычисляется ео»т(2) .

Порядок инициализации глобальных переменных, определяемых в разных единицах трансляции, стандартом языка С++ не фиксируется. Поэтому крайне неразумно строить код, зависящий от порядка инициализации глобальных переменных. Кроме того, невозможно перехватить исключение, сгенерированное инициализатором глобальной переменной (514.7). Использование глобальных переменных вообще желательно минимизировать, в особенности тех, что требуют сложной инициализации.

Глава 9. Исходные файлы и программы 276 В принципе, существует ряд приемов, позволяющих фиксировать порядок инициализации глобальных переменных, определенных в разных единицах трансляции. Однако они не являются ни эффективными, ни переносимыми. Например, динамические библиотеки плохо переживают зависимость от таких глобальных переменных. Хорошей альтернативой глобальным переменным могут служить функции, возвращающие ссылку. Например: 1иы иве свинг() ( вгаас 1аг ис = О; гегиги ис; ) Вызов иве соиле() действует как глобальная переменная, инициализация которой происходит при самом первом вызове (95.5, 97.1.2).

Например: уо(а г"() ( сонг«ввозе соипг (); /... //увеличить значение и вывести его Инициализация нелокальных переменных (статически распределенных) зависит от механизма запуска программ, реализованного в конкретной системе. Гарантируется правильность работы такого механизма при вызове функции та(и() . Отсюда следует, что в общем случае невозможно обеспечить правильность инициализации нелокальных переменнных в С++-коде, если сам этот код предназначен для работы в программах, написанных на иных языках программирования. Отметим, что переменные, инициализируемые константными выражениями (9С.5) не могут зависеть от значения объектов из других единиц трансляции и не требуют инициализации на этапе выполнения. Такие переменные можно безопасно использовать во всех случаях. 9.4.1.1.

Завершение выполнения программы Можно завершить работу одним из следующих способов: ° возвратом из функции аза(и (); ° вызовом ех11(); ° вызовом аЬозт(); ° генерацией неперехватываемого исключения. Дополнительно существуют нерекомендуемые, зависящие от реализации способы доведения программы до краха. Если выход из программы осуществляется вызовом стандартной библиотечной функции ех11О, то вызываются деструкторы для всех статически сконструированных объектов (910.4.9, 910.2.4).

В то же время, если прекращение работы программы достигается вызовом стандартной библиотечной функции аЬогг(), то этого не происходит. Отсюда следует, что при использовании функции ех11О мгновенного прекращения работы программы не происходит. Более того, вызов ех!1() из дест- 277 9.4. Программы руктора вообще может привести к бесконечной рекурсии. Функция ехй() объявля- ется следующим образом юЫ ехй ()иг); Как и у функции гиа(и(), возврат ехй() адресован системе в качестве результата работы программы. Нуль означает успешное завершение. При вызове ехй() не будут вызваны деструкторы локальных переменных во всех функциях вверх по цепочке имевших место функциональных вызовов.

Генерация и перехват исключений гарантируют корректное уничтожение локальных объектов (914.4.7). Вызов же ех!1() не позволяет корректно отработать всем функциям из цепочки вызовов. Позтому лучше не ломать контекст вызова функций и просто сгенерировать исключение, а вопрос о том, что делать дальше, оставить обработчикам. В языках С и С-ь-ь стандартная библиотечная функция агехй() позволяет вызвать некоторый код по выходу из программы.

Например: юЫ ту сгеап ар ( ); юЫ вотешлеге () ( Ц (агехй ( вту с1еапир) ==О) ( У ту с1еапир будет вызвана при нормальном завершении ейе ( соарес слишком много функлий а(ех!1 Это уже сильно напоминает автоматический вызов деструкторов глобальных переменных по выходу из программы (510.4.9, 510.2.4). Обратите внимание, что функция-аргумент агехй() сама не может иметь аргументов и возвращаемого значения. От конкретной реализации зависит предельное количество функций агехй(); при превышении предела агехй() возвращает нуль. Это делает агехй() менее полезной, чем могло показаться на первый взглид.

Деструкторы статически размещенных объектов (глобальных, 510.4.9; локальных в функциях с модификатором згайс, 57.1.2; определенных с модификатором йайс в классах, 910.2.4), созданных до вызова агехйЯ, вызываются после вызова У() . Деструкторы же таких объектов, созданных после вызова агехгг(), вызываются до вызова г() . Функции ехй(), аЬогг () и агехй() объявлены в <сзиИЬ>, Глава 9. Исходные файлы и программы 9.5. Советы 1.

Используйте заголовочные файлы для представления интерфейсов и логической структуры; В9.1, $9.3.2. 2. Включайте заголовочный файл в исходный файл, реализующий объявленные функции; 59.3.1. 3. Не определяйте глобальные сущности с одинаковыми именами, но с разным (пусть и похожим) смыслом в разных единицах трансляции; й9.2. 4.

Избегайте определений невстраиваемых функций в заголовочных файлах„ в9.2.1. 5. Используйте директивы Нвс!и4е только в глобальной области или в про- странствах имен; 99.2.1. 6. С помощью Нвс(иФе включайте только полные объявления; 99.2.1. 7. Реализуйте защиту от лишних включений; З9.3.3. 8.

Заключайте заголовочные файлы языка С в пространства имен во избежание конфликта глобальных имен; З8.2.9.1, В9.2.2. 9. Делайте заголовочные файлы самодостаточными; В9.2.3. 10. Различайте пользовательские интерфейсы и интерфейсы для разработчиков; в9.3,2. 11. Различайте обычные пользовательские интерфейсы и интерфейсы для пользователей-экспертов; й9.3.2. 12. Избегайте нелокальных объектов с инициализацией на этапе выполнения предназначенных для использования в качестве фрагментов программ, напи- санных не на С++; 99.4.1. 9.6.

Упражнения 1. (*2) Найдите, где в вашей системе находятся заголовочные файлы стандарт- ной библиотеки. Просмотрите список их имен. Есть ли среди них нестандартные заголовочные файлы? Могут ли нестандартные заголовки включаться с помощью <>? 2. (*2) Где хранятся заголовочные файлы нестандартных «фундаментальных» библиотек вашей системы? 3.

(*2.5) Напишите программу, которая читает исходные файлы на С++ и выво- дит имена файлов, включенных в них директивой плейбое. В результирующем списке примените отступы для наглядного показа информации о том, какие файлы включаются в тот или иной исходный файл. Опробуйте эту программу на реальных исходных файлах (и получите информацию об объеме включаемых файлов). 4. (*3) Модифицируйте программу из предыдущего упражнения, чтобы она вы- водила количество строк-комментариев, количество строк без комментариев, количество слов (разделенных пробельными символами) в каждом включаемом файле. 9.6. Упражнения 279 5.

(*2.5) Разработайте внешнее средство, которое проверяет перед компиляцией каждый исходный файл на предмет существования повторных включений заголовков и устраняет повторы. Опробуйте это средство на практике и сравните его со способами контроля повторных включений, рассмотренных в 99.3.3. Дает ли такое средство какие-либо дополнительные преимущества на этапе выполнения на вашей системе? 6. (*3) Как в вашей системе реализуется динамическая компоновка? Какие ограничения накладываются на динамически компонуемый код? Что дополнительно требуется от кола, чтобы он мог быть скомпонован динамически? 7. (*3) Откройте и прочтите 100 файлов по 1500 символов каждый.

Откройте и прочтите один файл, содержащий 150000 символов (см. пример в 921.5.1). Есть ли разница во времени выполнения задач? Каково наибольшее число файлов, которые можно одновременно открыть в вашей системе? Рассмотрите этот вопрос касательно использования включаемых файлов. 8. (*2) Модифицируйте нашу версию калькулятора так, чтобы его можно бьшо вызывать из та(л О, либо из любой другой функции (в виде обычного функционального вызова). 9. (*2) Нарисуйте диаграмму зависимостей модулей 89.3.2) для версии калькулятора, которая использует еггаг() вместо исключений 68.2.2). Часть!! Механизмы абстракции Здесь описываются средства языка С++ для определения и использования новых типов.

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

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

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

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