Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 206
Текст из файла (страница 206)
Составь~с список использованных конструкций, пе являющихся конструкциями С+«ь н определите, соответствуют лн они стандарту А1ч51 С. Сначала приведите программу в строгое соответствие с А)451 С (добав те прототипы и т. д.), затем преобразуйте в программу на С+«. Оцените время, необходимое для такого преобразования программы в 100 000 строк. 2. ('2.5) Напишите программу, помогающую конвер~ировать код из С в С++ путем переименования переменных, совпадающих с ключевыми слова»пи С+«. замены вызовов тайас () на пев п т.
д. Подсказка: ие пытайтесь достичь совершенства. 3. (*2) В С» прэграмме, написанной в ст>пе С (возможно той же, что преобразовывалась в упражнении 1) замените все используемые вызовы та!!ос () на вызовы иев. Подсказка: см. 6 Б.4[8 — 9]. 4. ('2.5) В С++ программе (возможно той же, что преобразовывалась в упражнении 1) минимизируйте использование макросов, глобальных переменных, нннциализируемых переменных и приведение типов в стиле С .
5. (3*) Возьмите С++ программу, являют!у>огя результатом «грубого» преобразования нз С, и искрит>>куйте ее с точки зрения Се. па локальность информации, абстракцию, удобочитаемость, расширяемость и на возможность повторного исг>ольж>вания отдельных частей. Проведите в программе какое-либо значительное изменение, основанное иа вашей критике.
6. (*2) Возьмите небольшую (около 500 строк) С н- щюграмму и преоб>разу!юе сев программу на С. Сравните исходную н преобразованную программы по размерам н возможностям сопронождения. 7. (3") Напишите небольшой набор текстовых программ для определения, поддерживает ли ваша реализапня С++ «наипоследнейше» средстна из стандарта. Например: какова область видимости переменной, описанной в инициализаторе [огя1а1етеп1 (6 Б.З.6)7 Поддерживаются ли аргументы шаблонов по умолчанию Я Б.35) и члены шаблона (6 13.6.2)? Поддерживается лн поиск ил>ен по аргументам (6 8.2.6)? Подсказка: см.
9 Б.2тй 8. (2 5*) Возьмите С+» программу, использующую <Х.Ь> и преобразуйтс ее на использование <Х> н <сХ>. Миннмизируйте использование директив ия(л(1. Приложение В Технические подробности Глубоко, в самом сердце сознания и Вселенной— есть смысл. — Слартибартфаст Что гарантирует стандарт? — наборы символов — целые литералы— константные выражения — продвижения и преобразования — многомерные массивы — поля и объединения — управление памятью — сборка мусора— пространства имен — контроль доступа — указатели на члены данных— шаолоны — статические члены — друзья — шаблоны в качестве параметров шаблона — выведение аргумента шаблона — ~урепаше и шаблоны инстанцирование — связывание имен — шаблоны и пространства имен— явное инстанцирование — советы. В.1.
Введение и обзор Эта глава описывает технические детали и примеры, которые не совсем вписываются в мою презентацию основных черт языка С++ и их использования. Представленные здесь подробности могут оказаться важными, когда вы будете писать программы, и очень важными, когда вы будете читать программы, написанные с нх применением. Однако я считаю их техническими деталями, которые не должны отвлекать студентов от главной цели, — научиться хорошо применять язык С++, а программистов от того, чтобы стараться выразить идеи как можно яснее и непосредственнее, насколько позволяет С++ В.2.
Стандарт Вопреки общему мнению, строгое следование стандартам языка С++ и библиотеки не гарантирует получения хорошей или даже переносимой программы. Стандарт ничего не говорит о том, хорош или плох данный фрагмент программы; он просто говорит, на что программист может (или не может) рассчитывать в реализации. Можно написать совершенно ужасающую программу в полном соответствии со стандартом, а большинство программ реалыюго мира опираются на особенности, не описываемые стандартом.
Очень важные вещи стандарт считает определенными в реализации. Это означает, что каждая реализация должна обеспечить специфическое четко определенное поведение ряда конструкций и задокументировать его. Например: Приложение В, Технические подробности 904 // четко определено: с/лаг имеет по крийней //мере 8 бат и всегда люжет содержать шсло 64 // определлетсл в реализации: урезание, если //с1лаг имеет только 8 бит ипз1япеб с/лаг с1 = 84; ипз1япес1 сваг с2 = 125б; сопвг 1п1 з!ее = 4*1024; с1ьаг раде[з1ее]; пои раде[з1ее»з1ее] = 7, // не определено Вероятный результат этого фрагмента кода — запись поверх данных, не относя- шихся к программе, и генерирование аппаратной ошибки/исключения.
От реализации не требуется выбирать между вероятными результатами. Там, где используются мощные оптимизаторы, эффект от неопределенного поведения может стать совершенно непредсказуемым. Если есть набор удовлетворительных и легко реализуемых альтернатив, особенность считается це неопределенной, а определяемой в реализации. Вполне себя оправдывают значительные время и силы, затрзченные на гарантии того, что программа не использует ничего не определенного стандартом.
Во многих случаях для этого существуют инструментальные средства. Инициализация с1 четко определена, поскольку в айаг должно быть по крайней мере 8 бит. Однако поведение инициализации с2 зависит от реализации, так как число битов в сйаг определяется в реализации. Если айаг имеет только 8 бит, значение 1256 будет урезано до 232 (9 В.6.2.1). Большинство определяемых в реализации особенностей относится к различиям в «железе», на котором будет работать программа.
Во время написания реальной программы обычно приходится опираться на поведение, определяемое в реализации. Это является ценой, которую мы платим за возможность эффективно работать с различными системами. Например, язык был бы гораздо проще, если бы все айаг были 8-битовыми, а все га1 — 32 битовыми. Однако' не так уж необычны 16-битовые и 32-битовые символьные наборы — так же как и числа, слишком большие, чтобы уместиться в 32 бита. Например, многие компьютеры теперь имеют диски емкостью более 32 Гбайт, так что для представления адреса на диске уместны 48-битовые и 64-битовые числа.
Чтобы максимально повысить переносимость, разумно явно выразить, на какие определяемые в реализации свойства мы опираемся, и самые сомнительные места изолировать в четко определенных местах программы. Типичный пример такой практики— представлять все зависимости от аппаратуры в виде констант и определений типов в некотором заголовочном файле. Чтобы поддержать такую технику, стандартная библиотека предоставляет питеПс 11т/1в (9 22.2). Неопределенное поведение неприятнее.
Конструкция считается не определенной стандартом, если от реалиаации не требуется какого-либо осмысленного поведения. Как правило, некоторые очевидные приемы реализации приводят к тому, что программы, использующие неопределенности, ведут себя очень плохо. Например: 905 В,З. Символьные наборы В.З. Символьные наборы Примеры в этой книге' написаны с использованием американского (США) варианта международного 7-битного символьного набора 130 646-1983, называемого АЯСП (АХ813.«-1968). У тех, кто применяет С++ в среде, использующей другой символьный набор, это может вызвать три проблемы: [1) АЯСП содержит символы пунктуации и операторные символы — такие как [, ( и ); для некоторых наборов зти символы недоступны. [2) Нам нужны обозначения для символов, не имеющих соответствующего символьного представления (например, перевод строки и «символ со значением 17»).
[3) АЯСП не содержит символов, использующихся в других языках (нс английском) — например, ь, ш или П. Ключевые слова Диграфы Триграфы апс( апс( ее Ы1апсУ Ыгог сотр1 по1 ог ог ед хог хог ед по1 ед <% ( а > ) <: [ %; й а «х гг= гг( гг< ( гг гг) гг> гг гг1 гг- )) )= Программы с ключевыми словами и диграфами гораздо лучше читаемы чем эквивалентные программы, написанные с использованием триграфов.
Однако если такие Имеется ввиду американское взданне. — Примем. лед. В.З.1. Сокращенный символьный набор Специальные символы АЯСП [, ), (, ), ) и ~ занимают позиции в символьном наборе, которые определены 130 как алфавитно-цифровые. В большинстве европейских символьных наборов 180-646 эти позиции заняты буквами, которых нет в английском алфавите. Например, датский национальный набор символов на их месте содержит гласныелЕ, ш, О, и, А и а. Без этих символов по-датски не напишешь сколько-нибудь осмысленного текста. Для того чтобы выражать национальные буквы переносимым образом при помощи по-настоящему стандартного минимального символьного набора, введен набор триграфов. Это может пригодиться для обмена программами, но не облегчает людям чтение таких программ.
Естественно, долговременное решение этой проблемы— дать программистам на С+« такое оборудование, которое поддерживает и их родной язык, и С++. К сожалению, для некоторых зто представляется недостижимым, и введение нового обрудовання может оказаться до огорчения медленным процессом. Чтобы помочь программистам обходиться с неполным набором символов, С++ обеспечивает альтернативы; Приложение В. Технические подробности 906 символы как ( недоступны, триграфы необходимы, чтобы не «потерять» символы в строках и символьных константах. Например, '(' превращается в 'за<', Некоторые предпочитают вместо традиционного обозначения операторов пользоваться ключевыми словами, такими как апс(.
В.З.2. Езсвре-символы Несколько символов имеют стандартные имена, использующие символ обратной ко- сой черты ~ в качестве езсаре-символа: Название АЯС11 Название С+ч- Название ооо ЬЬЬ Несмотря на свой внешний вид, это одиночные символы. Символ можно представить в виде одной, двух или трех восьмеричных цифр (с ~ перед ними) или шестнадцатеричным числом (с ~х перед цифрами). На число шестнадцатеричных цифр в последовательности нет ограничений Последовательность восьмеричных или шестнадцатеричных цифр заканчивается первым символом, не являющимся соответственно восьмеричной или шестнадцатеричной цифрой. Например: Восьмеричная Шестнадцатеричная Десятичная АЯСП "~6' '~60' '~137' '~хб' '~к 30' '~х051' АСК '0' 6 48 95 Это позволяе г представить любой символ из машинного символьного набора и, в частности, вставить такие символы в символьные строки (см.
9 5.2.2). Использование любых цифровых обозначений для символов делает программу непереносимой с одной машины на другую, на которой применяется другой символьный набор. Символьный литерал можно записать несколькими символами, например 'аб'. Такое применение архаично, зависит от реализации, и его лучше избегать. При вставке в строку цифровой константы в восьмеричном обозначении всегда разумно пользоваться трехзначными числами.