Читаем C++. Сборник рецептов онлайн бесплатно
C++. Сборник рецептов
Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.
Кристофер Диггинс , Джонатан Турканис , Джефф Когсуэлл , Д. Райан Стефенс
Компьютеры и Интернет / Программирование, программы, базы данныхC++ работает практически на любой платформе и используется в бесчисленном количестве приложений. Если вы купили или собираетесь купить эту книгу, вы, вероятно, являетесь программистом, инженером или исследователем, пишущим одно из таких приложений. Но независимо от того, что и для какой платформы вы пишете, велика вероятность, что вам придется снова решать многие из тех же проблем, которые уже решены другими программистами на C++ много лет назад. В этой книге мы будем решать многие из часто встречающихся проблем и объяснять каждое из решений.
Независимо от того, программируете ли вы на C++ уже много лет или используете его недавно, вы, скорее всего, знакомы с фрагментами, которые приходится переписывать для каждого нового проекта: арифметика и синтаксический анализ дат и времени, манипуляции со строками и текстом, работа с файлами, синтаксический анализ XML, использование стандартных контейнеров и т.п. Решения для всех таких проблем приведены в этой книге. Для некоторых случаев (например, арифметические операции с датами и временем) стандартная библиотека почти не содержит поддержки. Для других (например, работа со строками) стандартная библиотека содержит функционально богатые классы, но они не могут делать все, и решения некоторых очень часто встречающихся задач оказываются громоздкими.
Формат очень прост. Каждый рецепт содержит описание проблемы и код решения, а большинство содержит последующее обсуждение. Мы попытались быть прагматиками и решать проблемы, не слишком отклоняясь от цели, но во многих случаях имеются связанные проблемы, решение которых также очень полезно (или просто интересно), и мы приводим одну или две страницы пояснений.
Эта книга посвящена решению общих проблем с С++, но не является книгой для изучения С++. Мы предполагаем, что вы, по крайней мере, обладаете базовыми знаниями C++ и объектно-ориентированного программирования. В частности, будет полезно, если вы знакомы, по крайней мере, с:
• наследованием и виртуальными функциями С++;
• стандартной библиотекой;
• компонентами Standard Template Library (стандартной библиотекой шаблонов) (контейнерами, итераторами и алгоритмами);
• шаблонами.
Для чтения этой книги нет строгих предварительных требований, но наличие базовых знаний окажется весьма кстати.
При создании наших примеров кода мы стремились к простоте, переносимости и производительности. Разработка каждого решения использовала сходный метод: если возможно, использовался стандартный C++ (язык или библиотека); если невозможно, то в качестве замены использовался стандарт де-факто. Например, многие из рецептов, относящихся к строкам, применяют стандартный класс string, а большинство математических и научных рецептов используют стандартные численные типы, контейнеры и шаблоны. Стандартная библиотека имеет мощную поддержку в этих областях, так что стандартных возможностей более чем достаточно. Однако C++ либо имеет слабую стандартную поддержку, либо не имеет ее вовсе в части многопоточности или синтаксического анализа XML. Таким образом, мы используем поддержку многопоточности, предоставляемую библиотекой Boost Threads, а для функциональности синтаксического анализа XML-парсер (parser) Xerces.
Часто в C++ имеется множество способов сделать одно и то же, что дает разработчикам определенную гибкость, но и приводит к спорам. Большая часть примеров иллюстрирует наилучшее общее решение, которое мы смогли найти, но это не означает, что не существует еще лучшего решения. Если есть альтернативные решения, которые оказываются лучшими в одних случаях, но не являются таковыми в других (возможно, решение, использующее стандартную библиотеку, некрасиво или неинтуитивно — в этом случае мы показываем альтернативное решение с использованием Boost), мы представляем альтернативные решения, чтобы показать вам различные имеющиеся решения.
Большое количество примеров используют шаблоны. Если у вас нет опыта в написании шаблонов, вам следует получить его как можно скорее. В этой книге очень мало вводного материала по шаблонам, за исключением двух рецептов в главе 8: 8.11 и 8.12. Большая часть интересных разработок на C++ относится к области метапрограммирования с использованием шаблонов и методического проектирования.
В момент написания этой книги в сообществе C++ происходят большие изменения. Первый технический отчет (называемый TR1) более или менее стабилен. Он стандартизирует набор функций, которые будут добавлены в следующую версию стандарта С++. Не существует требования поддержки его реализациями стандартной библиотеки, но многие поставщики уже начали реализовывать TR1, и можно ожидать, что скоро эти функции появятся в поставляемых компиляторах. Многие из библиотек из TR1 впервые появились в проекте Boost.
Мы активно используем библиотеки из Boost. Boost — это набор рецензируемых переносимых библиотек с открытым кодом, который заполняет многие пробелы в стандартной библиотеке. Текущая версия в момент написания книги 1.32, и скоро должна появиться версия 1.33. В примерах мы приводим много указаний на конкретные библиотеки Boost. Для получения дополнительной информации по Boost посетите Web-сайт проекта по адресу
В этой книге используются следующие типографские соглашения.
Указывает на новые термины, URL, адреса e-mail, имена файлов, расширения файлов, пути, директории, утилиты Unix, команды и параметры командной строки.
<...>
В угловые скобки заключены элементы, которые требуется указать в командах и параметрах командной строки, и они выделены курсивом.
Шрифт постоянной ширины
Указывает код или его фрагменты. Например, шрифтом постоянной ширины набраны имена классов, методов и другие подобные элементы, при их появлении в тексте.
Жирный шрифт постоянной ширины
Показывает ввод пользователя в примерах ввода-вывода.
Указывает задаваемые пользователем элементы в примерах синтаксиса.
Указывает на подсказки, советы или общие замечания.
Указывает на предупреждения или предостережения.
Целью этой книги является помощь в вашей работе. Вы можете использовать код этой книги в ваших программах и документации. Вам не требуется обращаться к нам за разрешением, если вы не воспроизводите значительные фрагменты кода. Например, написание программы, которая использует несколько небольших кусков кода из этой книги, не требует разрешения. Продажа или распространение CD-ROM с примерами книг O'Reilly требует разрешения. Ответы на вопросы с помощью цитат из этой книги и цитирования кода не требуют разрешения. Встраивание значительного количества примеров кода из этой книги в вашу документацию к продукту требует разрешения.
Мы приветствуем, но не требуем полного указания источника. Обычно указание источника включает название, автора, издателя и ISBN. Например: «
Если вы полагаете, что использование вами примеров кода выходит за рамки личного пользования или подпадает под один из требующих разрешения вариантов, указанных выше, свяжитесь с нами по адресу
Пожалуйста, направляйте комментарии и вопросы по этой книге издателю:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
(800) 998-9938 (в США и Канаде)
(707) 829-0515 (международная или местная поддержка)
(707) 829-0104 (факс)
Для этой книги имеется Web-страница, на которой приводятся все исправления, примеры и дополнительная информация. Эта страница находится по адресу:
Чтобы высказать комментарий или задать технический вопрос по этой книге, отправьте электронное письмо по адресу:
Для получения дополнительной информации о нашей книге, ссылок, содержимого Resource Centers и сети O'Reilly Network посетите наш Web-сайт:
Когда вы на обложке вашей любимой технической книги видите пиктограмму Safari® Enabled, это означает что книга доступна в сети через O'Reilly Network Safari Bookshelf.
Safari предлагает решение лучшее, чем электронные книги. Это виртуальная библиотека, которая позволяет вам с легкостью выполнять поиск по тысячам лучших технических книг, использовать примеры кода из них, скачивать главы и быстро находить ответы, получая наиболее точную и современную информацию. Попробуйте сделать это по адресу
Наиболее важными людьми, которых я хочу поблагодарить, являются моя жена Дафна (Daphne) и мои дети Джесс (Jesse), Паскаль (Pascal) и Хлоя (Chloe). Написание книги это тяжелый труд, но еще важнее, что он отнимает много времени, и моя семья поддерживала меня и стойко терпела мою работу допоздна.
Я также благодарю технических редакторов, сделавших эту книгу лучше, чем она могла бы быть. Как и во многих других случаях, всегда полезно иметь вторую, третью и четвертую пару глаз, которые оценят ясность изложения и его правильность. Большое спасибо Дэну Саксу (Dan Saks), Уве Шниткер (Uwe Schnitker) и Дэвиду Тизу (David Theese).
Наконец, я должен поблагодарить моего редактора Джонатана Генника (Jonathan Gennick) за его всегда полезные советы по вопросам грамматики, стиля изложения и за философскую поддержку.
Я хочу поблагодарить Криса Ангера (Kris Unger), Джонатана Турканиса (Jonathan Turkanis), Джонатана Генника (Jonathan Gennick) и Райана Стивенса (Ryan Stephens) за их полезные предложения и критику, которые помогли мне писать лучше, чем я мог. Отдельное большое спасибо моей жене Мелани Карбонно (Melanie Charbonneau) за то, что она сделала мою жизнь светлее.
Так как мои главы затрагивают так много различных коммерческих продуктов и проектов с открытыми кодами и по каждому из них у меня было так много вопросов, мой список благодарностей необычно велик.
Во-первых, позвольте мне поблагодарить Рона Лихти (Ron Liechty), Говарда Хиннанта (Howard Hinnant) и инженеров в Metrowerks за их ответы на все мои вопросы и предоставление мне нескольких версий CodeWarrior.
Также я хочу поблагодарить разработчиков Boost.Build, особенно Владимира Пруса (Vladimir Prus), Рене Ривера (Rene Rivera) и Девида Абрамса (David Abrahams) — не только за ответы на мои вопросы, но также и за сборку системы компиляции Boost, которая сама по себе стала наиболее важным источником информации в главе 1.
Кроме того, спасибо Вальтеру Брайту (Walter Bright) из Digital Mars; Грегу Комю (Greg Comeau) из Comeau Computing; Пи Джей Плагеру (Р. J. Plauger) из Dinkumware; Колину Лапласу (Colin Laplace) из Bloodshed Software; Эду Малрою (Ed Mulroy) и Павлу Возенилеку (Pavel Vozenilek) из группы новостей borland.public.*; Арноду Дебене (Arnaud Debaene) и Игорю Тандетнику (Igor Tandetnik) из microsoft.public.vc.languages; Эрни Бойду (Earnie Boyd), Грегу Чикаресу (Greg Chicares), Адибу Тарабену (Adib Taraben), Джону Ванденбергу (John Vandenberg) и Леннарту Боргману (Lennart Borgman) из списка рассылки MinGW/MSYS; Кристоферу Фейлору (Christopher Faylor), Ларри Холлу (Larry Hall), Игорю Петчански (Igor Pechtchanski), Джошуа Даниелю Франклину (Joshua Daniel Franklin) и Дэйву Корну (Dave Korn) из списка Cygwin; Майку Стампу (Mike Stump) и Джефри Китингу (Geoffrey Keating) из списка разработчиков GCC; Марку Гудхенду (Mark Goodhand) из DecisionSoft и Дэвиду Н. Бертони (David N. Bertoni) из apache.org.
Я также в долгу перед Робертом Мекленбургом (Robert Mecklenburg), чье третье издание книги
Кроме того, Владимир Прус (Vladimir Prus), Мэтью Вилсон (Matthew Wilson), Райан Стивенc (Ryan Stephens) и Кристофер Диггинс (Christopher Diggins) выполнили подробный анализ ранних черновиков моих текстов.
Наконец, я должен поблагодарить моего редактора Джонатана Генника (Jonathan Gennick), мою жену Дженнифер (Jennifer) и моего деда Луиса С. Гудмэна (Louis S. Goodman), научившего меня писать.
Эта глава содержит рецепты по преобразованию исходного кода на C++ в исполняемые программы и библиотеки. При изучении этих рецептов вы узнаете об основных инструментах, используемых при сборке приложений на С++, различных типах двоичных файлов, используемых в этом процессе, и системах, предназначенных для упрощения управления процессом сборки.
Если посмотреть на названия рецептов в этой главе, то можно получить впечатление, что я снова и снова решаю одни и те же проблемы. И это будет правильно. Это происходит потому, что имеется большое количество способов сборки приложений С++, и хотя я не могу описать их все, я пытаюсь описать несколько наиболее важных методов. В первой десятке рецептов я показываю, как различными методами выполнять три базовые задачи - собирать статические библиотеки, собирать динамические библиотеки и собирать исполняемые файлы. Рецепты сгруппированы по методам; сначала я рассматриваю сборку из командной строки, затем с помощью системы Boost (Boost.Build), затем с помощью интегрированной среды разработчика (Integrated Development Environment (IDE), и наконец, с помощью GNU
Прежде чем вы начнете читать рецепты, обязательно прочтите следующие вводные разделы. Я объясню некоторую базовую терминологию, дам обзор инструментов командной строки, систем сборки и IDE, описываемых в этой главе, и покажу примеры исходного кода.
Даже если вы будете использовать систему сборки или IDE, вы должны начать с чтения рецептов по сборке из командной строки: эти рецепты представляют некоторые важные концепции, которые потребуются для понимания материала в дальнейшей части этой главы.
Три базовых инструмента, используемых для сборки приложений С++, — это





