Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 205
Текст из файла (страница 205)
2. Общее подмножество языков С и С++ — не лучшее подмнвжество для первоначального изучения С++; 91.6, ВВ.З. 3. Помните, что не все реализации С++ поддерживают его современный стандарт. Перед тем, как использовать в производственном коде какую-либо из новейших черт языка, опробуйте ее сначала на тестовых примерах, чтобы убедиться в поддержке стандарта вашей реализацией и уровнем достигаемой при этом производительности; 98.516-71, 916.5[10), ВВ.5(7].
8.4. Советы 959 4. 5. 6. 7. 8. 9. 18. 11. 12. 13. 14. 15. 16. 17. 18. Избегайте особенностей языка, помеченных как нежелательные (г(ергеса(ед), например статических глобальных переменных. Избегайте приведения типа в С-стиле; 86.2.7, ВВ.2.3. «Умолчательные !ив запрещены — явно определяйте типы для функций, переменных, констант и т.д.; ВВ.2.2. Преобразуя программу из языка С в язык С++, последовательно используйте прототипы функций и стандартные заголовочные файлы; ВВ.2.2. Преобразуя программу из языка С в язык С++, переименуйте переменные, совпадающие с ключевыми словами языка С++; ВВ.2.2.
Преобразуя программу из языка С в язык С++, возвраты та!!ос ( ) приводите к нужному типу, или замените вызовы та!!ос() на операцию пел; ВВ.2.2. При переходе от та!!ос () и аггее() к иеи и Ые!еге, подумайте о применении гесгог, раей Ьаей() и гезегге() вместо геа!!ос(); 83.8, 816.3.5. Преобразуя программу из языка С в язык С++, помните о том, что нет неявного преобразования из !иг в перечисления; при необходимости используйте явные преобразования; 94.8.
Объекты из пространства имен т! определяются в бессуффиксных заголовочных файлах (например, зМ:: сои! определяется в файле <!озггеат>). Старые реализации объявляют средства стандартной библиотеки в глобальном пространстве имен и располагают их в заголовочных файлах с суффиксом .Ь (:: сои! определяется в <!агггеат. Ь>); 89.2.2, ВВ.3.1. Если старый код проверяет возврат операции пе» на нуль, то нужно его исправить в сторону перехвата исключения Ьаг~ а!!ос, или применить иеи (иогЬ- гож); ~В.3.4. Если ваша реализация не поддерживает умолчательных значений параметров шаблона, указывайте аргументы явно. Часто с помощью оператора гуреае!' можно избежать повторных указаний аргументов (аналогично тому, как гуре«(е!' егг!ии помогает избежать написания Ьаз!с згг!и8<сйаг, сйаг ггаЪ <сйаг>, а!!осагог<сйаг»); ВВ.3.5.
Используйте <згг!и8> для доступа к хг4:: зи !и8 (<згг!ии. Ь> содержит функции для работы с С-строками); 99.2.2, ВВ.3.1. Для каждого стандартного заголовочного файла <Х. Ь>, помещающего объявления в глобальное пространство имен, заголовочный файл <сХ> помещает эти имена в пространство имен м4; 9В.3.1. Многие системы имеют заголовочный файл ' Бичий. Ь", определяющий строковый тип. Отметим, что такие строки отличаются от строк зЖии стандартной библиотеки. Предпочитайте стандартные средства нестандартным; 820.1, ВВ.З, ВС.2.
Используйте ехгеги "С" при объявлении С-функций; 89.2.4. 960 Приложение В. Совместимость В.Б. УПРажНЕНИЯ 1. ("2.5) Возьмите С-программу и преобразуйте ее в программу на С++. Со- ставьте список используемых конструкций, не являющихся конструкциями языка С++, и определите, соответствуют ли они стандарту А)ч8! С. Сначала приведите программу в строгое соответствие с А)ч81 С (прототипы и т.д.), а затем — с С++. Оцените время, необходимое для подобных преобразований в случае программы, содержащей 100000 строк кода. 2. (*2.5) Напишите программу, помогающую конвертировать С-программы на язык С++ путем переименовывания переменных, совпадающих с ключевыми словами С++, путем замены пгпИос О на операции поп и т.д. Намек: не пытайтесь достичь' полного совершенства.
3. (*2) Замените все вызовы пга11ос() в С++-программах, написанных в стиле языка С, на операции пеп. Подсказка: ВВ.418-9). 4. (*2.5) В С++-программе, написанной в стиле языка С, минимизируйте ис- пользование макросов, глобальных переменных, неинициализированных переменных и приведений типа в С-стиле. 5. ('3) Возьмите С++-программу, полученную в результате грубой переделки из С-программы, и покритикуйте ее на предмет локализации информации, абстракции, читабельности, расширяемости и возможности повторного использования ее частей. Выполните хотя бы одно существенное изменение программы, отталкиваясь от вашей критики. 6. (*2) Возьмите маленькую (скажем, строк на 500) С++-программу и преобра- зуйте ее в программу на С.
Сравните оригинал и полученный результат по размеру и возможностям сопровождения. 7. (*3) Напишите небольшой набор тестовых программ для выяснения, поддер- живает ли ваша С++-реализация самые последние стандарты. Например, какова область видимости переменной, определенной в инициализирукнцей секции оператора 1ог (8В.3.6)?, поддерживаются ли умолчательные значения параметров шаблонов (ВВ.3.5)?, поддерживаются ли шаблонные члены шаблонов (813.6.2)?, поддерживается ли поиск имен по аргументам (58.2.6)? Подсказка: $В.2.4. 8. ('2.5) Возьмите С++-программу, использующую заголовочный файл <Х.й> и преобразуйте ее так, чтобы она использовала заголовочные файлы <Х> и <сХ>. Минимизируйте применение директив пзгп8.
Приложение С Технические подробности Глубоко в сердце сознания и Вселенной — есть смысл. — Слартибартд)аст Стандарт — символьные наборы — целые литералы — константные выражения — продвижения и преобразования — многомерные массивы — битовые поля и объединения — управление памятью — автоматическая сборка мусора— пространства имен — контроль доступа — указатели на члены данных — шаблоны — статические члены — друзья — шаблоны в качестве параметров шаблона — выведение аргумента шаблона — шаблоны и ключевое слово гуренате— конкретизация — связывание имен — шаблоны и пространства имен — явная конкретизация — советы. С.1.
Введение и обзор Данная глава содержит технические детали и примеры, которые не совсем вписываются в то, как я представляю основные свойства языка С++ и их применение. Эти технические детали важны при реальном написании программ и еше более важны при чтении текстов ранее написанных программ, которые могут эти детали содержать. В то же время, я считаю эти детали техническими, поскольку они не должны отвлекать внимание студентов от важнейшей задачи первоначального изучения языка С-ь+, а программистов — от написания программ в стиле, обеспечиваюшем (насколько это вообше возможно) ясное и непосредственное отражение проектных идей.
С.2. Стандарт Вопреки устоявшемуся мнению, строгое следование стандарту языка и библиотеки не гарантирует хорошего исходного кода программы и ее переносимости. Стандарт ничего не говорит о том, плох или хорош конкретный фрагмент программы; он просто формулирует, на что программист может рассчитывать в разных реализациях, а на что не может. Вполне можно написать ужасную программу в полном Приложение С. Технические подробности 962 соответствии со стандартом, в то время как множество успешных программ могут применять особенности языка, не описываемые стандартом. Много важных вещей стандарт отдает на откуп реализациям.
В таких случаях реализации должны обеспечить хотя и специфическое, но четко определенное и хорошо документированное поведение языковых конструкций. Например: ипз(япед ейаг с1 = б4;,У однозначно: ейаг всегда имеет по крайней мере 8 бит гУ и всегда может содержать значение б4 ипз18пед ейаг е2 = 125б; 77 зависит от реализации: урезание в случае В-битного ейаг Инициализация с1 четко определена, поскольку тип айаг обязан содержать по крайней мере 8 бит. В то же время, инициализация с2 зависит от реализации, так как точное количество бит в сйаг определяется не стандартом, а реализацией.
Например, если в айаг всего 8 бит, то значение 1256 усекается до 232 6С.6.2.1). Большая часть зависящих от реализации свойств языка коррелирует с различиями в железе, на котором программе предстоит работать. При написании реальных программ приходится считаться с их поведением, зависящим от реализации. Такова цена за возможность эффективно работать на разных системах. Например, язык был бы проще, если бы тип сйаг был жестко привязан к 8 битам, а тип гпг — к 32 битам. Однако имеются системы с ]6- или 32-битовыми символьными наборами, а целые числа в реальных задачах не умещаются в 32 бита — для дисков емкостью более 32 Гбайт более уместны 48-битовые или 64-битовые числа.
Для улучшения переносимости лучше всего четко и явно обозначить места программы, зависящие от реализации, а особо тонкие различия тщательно локализовать и задокументировать. Обычная практика заключается в том, чтобы все зависимости размеров от аппаратуры представить в виде констант и определений типов в некотором заголовочном файле. Стандартная библиотека с этой целью предоставляет питег1е 11т1я.
[822.2). Неопределенное поведение более коварно. Конструкция помечается стандартом как неопределенная (ипде1)пегГ), если невозможно потребовать от реализаций какого-либо разумного ее поведения. Как правило, программы, использующие конструкции с неопределенным поведением, ведут себя очень плохо. Например: сопя 1пг яхе = 4*1024; сваг раде [яге]; го14 Г() ( раде [яее+яее] =7; ) 77 не определено Возможные последствия этого фрагмента могут включать в себя перезаписывание некоторых не имеющих отношения к нему данных и генерирование аппаратных исключений [ошибок). От реализации не требуется в таких случаях осуществлять выбор между возможными последствиями.
Там, где используются мощные технологии оптимизации кода, последствия применения в программе конструкций с неопределенным поведением вообще не поддаются предсказанию. Если имеется набор очевидных и легко реализуемых альтернатив, конструкция считается зависящей от реализации, а не как имеющая неопределенное поведение. В процессе разработки и написания программ стоит уделить серьезное внимание, силы и время, чтобы гарантировать отсутствие в программе конструкций, не 963 С.З.
Символьные наборы соответствующих стандарту. Часто это можно выполнить с помощью специализи- рованных инструментальных средств. С.З. Символьные наборы Примеры в этой книге составлены с учетом американского варианта международного 7-битного символьного набора 180 646-1983, названного АБСП (А)ч813.4-1968).
Это может породить следующие проблемы у людей, работающих с С++ в средах с другими символьными наборами: 1. АБСП содержит символы пунктуации и символы операций ( П ( и . ), которые могут быть недопустимыми в других символьных наборах. 2. Требуются обозначения для символов, не имеющих удобного представления (например, «новая строка» или символ с числовым кодом 17"). 3. АБСП не содержит символов (С, А и др.), применяемых в языках, отличных от английского. С.3.1. Ограниченные наборы символов АБСП символы (, ), П П ~ и ~ занимают в символьном наборе позиции, трактуемые 180 как алфавитные. В большинстве европейских символьных наборов 180-646 эти позиции заняты буквами, которых в английском алфавите нет.
Например, в датском языке тут присутствуют гласные ~Е, ж, И, а, А 6 6. Без этих символов по-датски не напишешь сколько-нибудь осмысленного текста. Чтобы выражать национальные символы переносимым способом при помощи минимальных символьных наборов, вводятся глриграфы (ггт8гар/и). Это помогает распространению программ, но не облегчает чтение программ людьми. Долговременным решением проблемы могли бы стать локализованные (под национальные языки) средства разработки программ на С++.