Читать онлайн «Язык C в 21 веке»

Автор Бен Клеменс

-^>\ -5βί , 4* ЗЫ . л* *ч **. si *^ш 1н Бен Клеменс *Λ С=. O'REILLY' Бен Клеменс Язык С в XXI веке Ben Klemens 21st Century С O'REILLY Бен Клеменс Язык С в XXI веке Москва, 2015 УДК 004. 6 ББК 32. 973. 26 К48 Клсменс Бен К48 Язык С в XXI веке / пер. с англ. А. А. Слинкина. - М: ДМК Пресс, 2015. - 376 с: ил. ISBN 978-5-97060-101-3 Янык С — не просто фундамент псех современных я;зыкон программирования, он π сам — современный язык, идеальный для написания эффективных приложении передового уровня. Последние 20 лет С не стоял на месте. Сам ялык π окружающая его экосистема подвергаются пересмотру Эта книга начинается там, где другие закапчиваются.
В пей рассказано, как изменилась функциональное гь, поддерживаемая любым компилятором, благодаря двум новым стандартам С, вышедшим со времен оригинального ANSI. Цель книги - рассмотреть то, чего пег в других учебниках по С: инструменты и окружение; библиотеки для работы со связанными списками π анализаторами XML; написан не удобочитаемою кода с дружественным программным интерфейсом. Издание предназначено для программистов, имеющих опыт работы па каком-либо языке и обладающими базовыми знаниями о С. УДК 004. 6 ББК 32. 973. 26 Все Ирана защищены. Любая часть этой киши не может быть воспроизведена и какой бы то ни было форме и какими бы то пи было средпвамп без письменного разрешения владельцев авторских нрав. Материал, изложенный к данной книге, многократно проверен. По поскольку вероишость технических ошибок все равно существует, издательство не может гараптиронать абсолютную точность π правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-1-491-90389-6 (апг. ) Copyright © 2015 Ben Klcmcns ISBN 978-5-97060-101-3 (рус. ) © Оформление, иеренод, ДМК Пресс, 2015 Содержание Предисловие 11 Часть I ♦ Окружение 23 Глава 1 ♦ Настраиваем среду для компиляции 24 Работа с менеджером пакетов 25 Компиляция программ на С в Windows 27 POSIX в Windows 27 Компиляция программ на С при наличии подсистемы POSIX 28 Компиляция программ на С в отсутствие подсистемы POSIX 29 Как пройти в библиотеку? 30 Несколько моих любимых флагов 32 Пути 33 Компоновка во время выполнения 36 Работа с файлами makefile 36 Задание переменных 37 Правила 40 Сборка библиотек из исходного кода 43 Сборка библиотек из исходного кода (даже если системный администратор против) 45 Компиляция С-программы с помощью встроенного документа 46 Включение файлов-заголовков из командной строки 46 Универсальный заголовок 47 Встроенные документы 48 Компиляция из stdin 50 Глава 2 ♦ Отладка, тестирование, документирование 51 Работа с отладчиком 51 Отладка программы как детективная история 53 Переменные GDB 62 Распечатка структур 63 Использование Valgrind для поиска ошибок 67 Автономное тестирование 69 Использование программы в качестве библиотеки 72 Покрытие 73 Встроенная документация 74 Doxygen 74 Грамотное программирование с помощью CWEB 76 Проверка ошибок 78 Ошибки и пользователи 78 Учет контекста, в котором работает пользователь 80 Как следует возвращать уведомление об ошибке? 81 6 ♦ Содержание ГлаваЗ ♦ Создание пакета для проекта 83 Оболочка 84 Замена команд оболочки их выводом 84 Применение циклов for в оболочке для обработки набора файлов 86 Проверка наличия файла 88 Команда f с 90 Файлы makefile и скрипты оболочки 92 Создание пакета с помощью Autotools 95 Пример работы с Autotools 96 Описание Makefile с помощью Makefile. am 100 Скрипт configure 104 Глава 4 ♦ Управление версиями 108 Получение списка отличий с помощью diff 109 Объекты Git НО Тайник 114 Деревья и их ветви 115 Объединение 116 Перемещение 117 Дистанционные репозитории 118 Глава 5 ♦ Мирное сосуществование 121 Динамическая загрузка 121 Ограничения динамической загрузки 124 Процесс 124 Писать так, чтобы можно было понять 124 Функция-обертка 125 Контрабанда структур данных через границу 126 Компоновка 128 Python как включающий язык 128 Компиляция и компоновка 129 Условный подкаталог для Automake 130 Distutils при поддержке Autotools 131 Часть II ♦ Язык 134 Глава 6 ♦ Ваш приятель - указатель 136 Автоматическая, статическая и динамическая память 136 Автоматическая 137 Статическая 137 Динамическая 137 Переменные для хранения постоянного состояния 140 Указатели без malloc 142 Содержание ♦ 7 Структуры копируются, для массивов создаются псевдонимы 143 malloc и игрища с памятью 146 Виноваты звезды 147 Все, что нужно знать об арифметике указателей 148 Typedef как педагогический инструмент 150 Глава 7 ♦ Несущественные особенности синтаксиса С, которым в учебниках уделяется чрезмерно много внимания 153 Ни к чему явно возвращать значение из main 154 Пусть объявления текут свободно 154 Меньше приведений 157 Перечисления и строки 159 Метки, goto, switch и break 160 К вопросу о goto 161 Предложение switch 163 Нерекомендуемый тип float 164 Сравнение чисел без знака 167 Безопасное преобразование строки в число 168 Глава 8 ♦> Важные особенности синтаксиса С, которые в учебниках часто не рассматриваются 171 Выращивание устойчивых и плодоносящих макросов 172 Приемы работы с препроцессором 176 Проверочные макросы 179 Защита заголовков 181 Компоновка с ключевыми словами static и extern 183 Переменные с внешней компоновкой в файлах-заголовках 184 Ключевое слово const 186 Форма существительное-прилагательное 187 Конфликты 187 Глубина 188 Проблема char const ** 189 Глава 9 ♦> Текст 192 Безболезненная обработка строк с помощью asprintf 192 Безопасность 195 Константные строки 196 Расширение строк с помощью asprintf 197 necHbostrtok 199 Unicode 203 Кодировка для программ на С 205 Библиотеки для работы с Unicode 206 Пример кода 208 8 ♦ Содержание Глава 10 ♦ Улучшенная структура 211 Составные литералы 212 Инициализация с помощью составных литералов 213 Макросы с переменным числом аргументов 213 Безопасное завершение списков 215 Несколько списков 216 Foreach 217 Векторизация функции 218 Позиционные инициализаторы 219 Инициализация массивов и структур нулями 221 Псевдонимы типов спешат на помощь 222 К вопросу о стиле 224 Возврат нескольких значений из функции 225 Извещение об ошибках 226 Гибкая передача аргументов функциям 228 Объявление своей функции по аналогии с printf 229 Необязательные и именованные аргументы 231 Доведение до ума бестолковой функции 233 Указатель на void и структура, на которую он указывает 239 Функции с обобщенными входными параметрами 239 Обобщенные структуры 244 Глава 11 ♦ Объектно-ориентированное программирование на С 249 Расширение структур и словарей 251 Реализация словаря 253 С без зазоров 257 Функции в структурах 261 V-таблицы 265 Область видимости 270 Закрытые элементы структуры 271 Перегрузка 272 Generic 274 Подсчет ссылок 277 Пример: объект подстроки 277 Пример: основанная на агентах модель формирования групп 281 Заключение 288 Глава 12 ♦> Параллельные потоки 290 Окружение 291 Составные части 292 ОрепМР 293 Компиляция для использования ОрепМР 294 Содержание ♦ 9 Интерференция 295 Map-reduce 296 Несколько задач 297 Поточная локальность 299 Локализация нестатических переменных 300 Разделяемые ресурсы 300 Атомы 305 Библиотека pthread 307 Атомы С 311 Атомарные структуры 315 Глава 13 ♦> Библиотеки 320 GLib 320 Стандарт POSIX 321 Разбор регулярных выражений 321 Использование mmap для очень больших наборов данных 326 Библиотека GNU Scientific Library 328 SQLite 331 Запросы 332 HbxmlHcURL 334 Эпилог 338 Приложение ♦> Основные сведения о языке С 339 Структура 339 В С необходим этап компиляции, состоящий из одной команды 340 Существует стандартная библиотека, это часть операционной системы 341 Существует препроцессор 341 Существуют комментарии двух видов 342 Нет ключевого слова print 342 Объявления переменных 342 Любая переменная должна быть объявлена 342 Даже функции необходимо объявлять или определять 343 Базовые типы можно агрегировать в массивы и структуры 344 Можно определять новые структурные типы 345 Можно узнать размер типа 346 Не существует специального типа строки 346 Функции и выражения 347 Правила видимости в С очень просты 347 Функция main имеет особый смысл 348 Большая часть работы программы на С сводится к вычислению выражений 348 При вычислении функций используются копии входных аргументов 349 10 ♦ Содержание Выражения заканчиваются точкой с запятой 349 Есть много сокращенных способов записи арифметических операций 349 В С понятие истины трактуется расширительно 350 Результатом деления двух целых всегда является целое 350 В С имеется тернарный условный оператор 351 Ветвления и циклы несильно отличаются от других языков 351 Цикл for - просто компактная форма цикла while 352 Указатели 353 Можно напрямую запросить блок памяти 354 Массивы - это просто блоки памяти, любой блок памяти можно использовать как массив 354 Указатель на скаляр - это по существу массив с одним элементом 355 Существует специальная нотация для доступа к полям структур по указателю 356 Указатели позволяют изменять аргументы функции 356 Любой объект где-то находится, и, значит, на него можно указать 357 Глоссарий 358 Библиография 363 Предметный указатель 365 Предисловие Это ли истинный панк-рок, Верный, как линия партии?