Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Язык С в XXI веке

Покупка
Артикул: 712435.01.99
Язык С — не просто фундамент всех современных языков программирования, он и сам — современный язык, идеальный для написания эффективных приложений передового уровня. Последние 20 лет С не стоял на месте. Сам язык и окружающая его экосистема подвергаются пересмотру. Эта книга начинается там, где другие заканчиваются. В ней рассказано, как изменилась функциональность, поддерживаемая любым компилятором, благодаря двум новым стандартам С, вышедшим со времен оригинального ANSI. Цель книги - рассмотреть то, чего нет в других учебниках по С: инструменты и окружение; библиотеки для работы со связанными списками и анализаторами XML; написание удобочитаемого кода с дружественным программным интерфейсом. Издание предназначено для программистов, имеющих опыт работы на каком-либо языке и обладающими базовыми знаниями о С.
Клеменс, Б. Бен, К. Язык С в XXI веке / Клеменс Бен ; пер. с англ. А.А. Слинкина. - Москва : ДМК Пресс, 2015. - 376 с. - ISBN 978-5-97060-101-3. - Текст : электронный. - URL: https://znanium.com/catalog/product/1027782 (дата обращения: 01.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Язык С в XXI веке

Бен Клеменс

21st Century C

Ben Klemens

Язык С в XXI веке  

Москва, 2015

Бен Клеменс

УДК 004.6
ББК 32.973.26
 
К48
 

 
 
Клеменс Бен

К48
Язык С в XXI веке / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс, 2015. – 
376 с.: ил.

ISBN 978-5-97060-101-3

Язык C — не просто фундамент всех современных языков программирования, он 
и сам — современный язык, идеальный для написания эффективных приложений 
передового уровня. Последние 20 лет C не стоял на месте. Сам язык и окружающая 
его экосистема подвергаются пересмотру. Эта книга начинается там, где другие заканчиваются. В ней рассказано, как изменилась функциональность, поддерживаемая 
любым компилятором, благодаря двум новым стандартам C, вышедшим со времен 
оригинального ANSI. Цель книги – рассмотреть то, чего нет в других учебниках по 
C: инструменты и окружение; библиотеки для работы со связанными списками и 
анализаторами XML; написание удобочитаемого кода с дружественным программным интерфейсом.
Издание предназначено для программистов, имеющих опыт работы на каком-либо 
языке и обладающими базовыми знаниями о С.

УДК 004.6
ББК 32.973.26

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой 
бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность 
технических ошибок все равно существует, издательство не может гарантировать абсолютную 
точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги.

ISBN 978-1-491-90389-6 (анг.)
Copyright © 2015 Ben Klemens

ISBN 978-5-97060-101-3 (рус.)
© Оформление, перевод, ДМК Пресс, 2015

Содержание

Предисловие .................................................................11

Часть I  Окружение ......................................................23

Глава 1  Настраиваем среду для компиляции ...................24
Работа с менеджером пакетов ..................................................................................................25
Компиляция программ на C в Windows ...............................................................................27
POSIX в Windows .................................................................................................................27
Компиляция программ на C при наличии подсистемы POSIX ...........................28
Компиляция программ на C в отсутствие подсистемы POSIX ...........................29
Как пройти в библиотеку? ........................................................................................................30
Несколько моих любимых флагов ..................................................................................32
Пути ...........................................................................................................................................33
Компоновка во время выполнения ................................................................................36
Работа с файлами makefile ........................................................................................................36
Задание переменных ...........................................................................................................37
Правила ....................................................................................................................................40
Сборка библиотек из исходного кода ...................................................................................43
Сборка библиотек из исходного кода (даже если системный администратор 
против) .....................................................................................................................................45
Компиляция C-программы с помощью встроенного документа ................................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

 Содержание

Глава 3  Создание пакета для проекта ............................83
Оболочка .........................................................................................................................................84
Замена команд оболочки их выводом ...........................................................................84
Применение циклов for в оболочке для обработки набора файлов ....................86
Проверка наличия файла ...................................................................................................88
Команда fc ...............................................................................................................................90
Файлы makefile и скрипты оболочки ....................................................................................92
Создание пакета с помощью Autotools .................................................................................95
Пример работы с Autotools ...............................................................................................96
Описание Makefile с помощью Makefile.am ............................................................. 100
Скрипт configure ................................................................................................................ 104

Глава 4  Управление версиями ....................................108
Получение списка отличий с помощью diff ..................................................................... 109
Объекты Git ................................................................................................................................ 110
Тайник ................................................................................................................................... 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  Несущественные особенности синтаксиса C, 
которым в учебниках уделяется чрезмерно много 
внимания ....................................................................153
Ни к чему явно возвращать значение из main ................................................................ 154
Пусть объявления текут свободно ...................................................................................... 154
Меньше приведений ................................................................................................................ 157
Перечисления и строки ........................................................................................................... 159
Метки, goto, switch и break .................................................................................................... 160
К вопросу о goto ................................................................................................................. 161
Предложение switch ......................................................................................................... 163
Нерекомендуемый тип float .................................................................................................. 164
Сравнение чисел без знака ..................................................................................................... 167
Безопасное преобразование строки в число .................................................................... 168

Глава 8  Важные особенности синтаксиса C, которые 
в учебниках часто не рассматриваются ............................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
Песнь о strtok .............................................................................................................................. 199
Unicode ......................................................................................................................................... 203
Кодировка для программ на C ...................................................................................... 205
Библиотеки для работы с Unicode .............................................................................. 206
Пример кода ........................................................................................................................ 208

 Содержание

Глава 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  Объектно-ориентированное 
программирование на C .................................................249
Расширение структур и словарей ........................................................................................ 251
Реализация словаря .......................................................................................................... 253
С без зазоров........................................................................................................................ 257
Функции в структурах ............................................................................................................ 261
V-таблицы ............................................................................................................................ 265
Область видимости .................................................................................................................. 270
Закрытые элементы структуры .................................................................................... 271
Перегрузка ................................................................................................................................... 272
_Generic ................................................................................................................................. 274
Подсчет ссылок .......................................................................................................................... 277
Пример: объект подстроки ............................................................................................. 277
Пример: основанная на агентах модель формирования групп .......................... 281
Заключение .......................................................................................................................... 288

Глава 12  Параллельные потоки ...................................290
Окружение ................................................................................................................................... 291
Составные части ................................................................................................................. 292
OpenMP ........................................................................................................................................ 293
Компиляция для использования OpenMP ............................................................... 294

Содержание  9

Интерференция .................................................................................................................. 295
Map-reduce ........................................................................................................................... 296
Несколько задач ................................................................................................................. 297
Поточная локальность ............................................................................................................. 299
Локализация нестатических переменных ................................................................. 300
Разделяемые ресурсы .............................................................................................................. 300
Атомы ..................................................................................................................................... 305
Библиотека pthread .................................................................................................................. 307
Атомы C ........................................................................................................................................ 311
Атомарные структуры ...................................................................................................... 315

Глава 13  Библиотеки .................................................320
GLib ................................................................................................................................................ 320
Стандарт POSIX ........................................................................................................................ 321
Разбор регулярных выражений .................................................................................... 321
Использование mmap для очень больших наборов данных ............................... 326
Библиотека GNU Scientific Library .................................................................................... 328
SQLite ............................................................................................................................................ 331
Запросы ................................................................................................................................. 332
libxml и cURL ............................................................................................................................. 334

Эпилог ........................................................................338

Приложение  Основные сведения о языке C ...................339
Структура .................................................................................................................................... 339
В C необходим этап компиляции, состоящий из одной команды .................... 340
Существует стандартная библиотека, это часть операционной системы ...... 341
Существует препроцессор .............................................................................................. 341
Существуют комментарии двух видов ....................................................................... 342
Нет ключевого слова print .............................................................................................. 342
Объявления переменных ........................................................................................................ 342
Любая переменная должна быть объявлена ............................................................ 342
Даже функции необходимо объявлять или определять ...................................... 343
Базовые типы можно агрегировать в массивы и структуры .............................. 344
Можно определять новые структурные типы ......................................................... 345
Можно узнать размер типа ............................................................................................. 346
Не существует специального типа строки ................................................................ 346
Функции и выражения ........................................................................................................... 347
Правила видимости в C очень просты ....................................................................... 347
Функция main имеет особый смысл ........................................................................... 348
Большая часть работы программы на C сводится к вычислению 
выражений ........................................................................................................................... 348
При вычислении функций используются копии входных аргументов .......... 349

 Содержание

Выражения заканчиваются точкой с запятой ......................................................... 349
Есть много сокращенных способов записи арифметических операций ........ 349
В C понятие истины трактуется расширительно ................................................... 350
Результатом деления двух целых всегда является целое .................................... 350
В C имеется тернарный условный оператор ............................................................ 351
Ветвления и циклы несильно отличаются от других языков ............................ 351
Цикл for – просто компактная форма цикла while ................................................ 352
Указатели ..................................................................................................................................... 353
Можно напрямую запросить блок памяти ............................................................... 354
Массивы – это просто блоки памяти, любой блок памяти можно 
использовать как массив ................................................................................................. 354
Указатель на скаляр – это по существу массив с одним элементом ................ 355
Существует специальная нотация для доступа к полям структур 
по указателю ........................................................................................................................ 356
Указатели позволяют изменять аргументы функции ........................................... 356
Любой объект где-то находится, и, значит, на него можно указать ................. 357

Глоссарий ...................................................................358

Библиография .............................................................363

Предметный указатель ..................................................365

Предисловие

Это ли истинный панк-рок,
Верный, как линия партии?

Wilco, «Too Far Apart»

Язык C и панк-рок

В языке C совсем немного ключевых слов, немало острых углов и безграничные 
возможности. Он позволяет сделать абсолютно все. Его изучение можно сравнить 
с гитарными аккордами C, G и D – основные движения освоить легко, а потом всю 
жизнь можно совершенствоваться. Отвергающие C боятся скрытой в нем мощи, 
считая ее небезопасной. По всем рейтингам C неизменно занимает первое место 
среди языков, продвижение которых не спонсируется никакими корпорациями 
или фондами1.
Языку уже 40 лет, то есть он достиг среднего возраста. Ребята, создавшие его, 
сделали это вопреки желанию руководства – полная аналогия с истоками панкрока, – но случилось это в 1970-х годах, и у языка было достаточно времени, чтобы 
стать популярным.
Что происходило, когда панк-рок стал популярным? Зародившись в 1970-х 
годах, панк, безусловно, вышел с обочины на большую дорогу. Тиражи альбомов 
таких групп, как The Clash, The Offspring, Green Day и The Strokes, исчисляются миллионами экземпляров, а в местном супермаркете мне доводилось слышать 
легкие инструментальные переложения песен в стиле отпочковашегося от панкрока музыкального жанра «грандж». Бывший солист группы «Слиттер-Кинни» 
теперь ведет популярное комедийное шоу, в котором часто язвительно пародируются панк-рокеры2. В ответ на продолжающуюся эволюцию можно было бы занять жесткую позицию и сказать, что панк – это только то, что было в начале, а все 
остальное – легонький поп-панк для массовой аудитории. Блюстители традиций 
могут слушать свои пластинки 70-х годов, а когда бороздки износятся – скачать 
оцифрованное издание. А своих малолетних отпрысков одеть в «кенгурушки» – 
ностальгируя по группе «Рамонес».
Чужим этого не понять. Кто-то, слыша слово «панк», представляет себе канувшее в историю явление 1970-х годов – что-то связанное с парнями, которые делали нечто необычное. Традиционалисты, которые все еще любят и слушают диски 
Игги Попа, ловят свой кайф, но от того впечатление, что панк закостенел и уже 
неактуален, лишь усиливается.

1 Это предисловие, вне всяких сомнений, многим обязано статье Криса Адамсона «Punk 
Rock Languages: A Polemic» по адресу http://pragprog.com/magazines/2011-03/punkrock-languages.
2 С такими стихами, как «Can’t get to heaven with a three-chord song», быть может, Слитера-Кинни стоило отнести к постпанку? К сожалению, на панк нет стандарта ИСО, на 
который можно было бы ориентироваться, решая, кого куда отнести.

 Предисловие
Почему именно OCaml?

Однако вернемся в мир C. Тут тоже есть как традиционалисты, размахивающие 
знаменем со словами ANSI 89, так и люди, готовые использовать все, что реально 
работает, и даже не знающие, что код, который они пишут, в 1990-е годы нельзя было бы откомпилировать или запустить. Чужаки не замечают разницы. Они 
видят написанные в 1980-е книги, которые все еще лежат на прилавках, читают 
написанные в 1990-е онлайновые пособия, внимают упертым традиционалистам, 
которые настаивают, что и сегодня нужно писать, как тогда, и даже не понимают, 
что сам язык и его пользователи не застыли в развитии. Печально это – ведь они 
отказываются от поистине замечательных вещей.
Эта книга о том, как порвать с традицией и вернуть C новизну панк-рока. Я не 
собираюсь сравнивать свой код с оригинальной спецификацией, изложенной 
в книге Кернигана и Ричи 1978 года. В моем смартфоне 512 мегабайт памяти, так 
зачем же авторы учебников по C продолжают на десятках страниц наставлять, 
как сократить размер исполняемого файла на несколько килобайтов? Я пишу 
этот текст на дешевеньком нетбуке, способном выполнять 3 200 000 000 машинных команд в секунду, так какое мне дело до разрядности операндов коман ды: 
8 или 16? Мы же в любом случае пишем на C, поэтому наш удобочитаемый, но 
неидеально оптимизированный код все равно будет работать на порядок быстрее, чем сравнимый код на любом другом распухшем от обилия функциональности языке.

Вопросы и ответы (или о параметрах этой книги)

В. Чем эта книга отличается от других книг по C?
О. Одни книги лучше написаны, другие даже занимательны, но у всех учебников по C есть одна общая особенность (а я прочитал их множество, в том числе 
[Deitel 2013], [Griffiths 2012], [Kernighan 1978], [Kernighan 1988], [Kochan 2004], 
[Oualline 1997], [Perry 1994], [Prata 2004] и [Ullman 2004]). По большей части, они 
были написаны до выхода стандарта C99 , в котором упрощены многие аспекты 
использования языка. А бывает и так, что в очередное издание книги просто включено несколько замечаний о новшествах, но нет никакого серьезного переосмысления способов работы с языком. Во всех говорится, что, возможно, существуют 
библиотеки, которые могут пригодиться в собственном коде, но, как правило, ни 
слова об инструментах установки и экосистеме, благодаря которой эти библиотеки оказываются надежными и в разумной степени переносимыми. Материал, 
изложенный в этих учебниках, по-прежнему остается в силе и не утратил ценности, только вот современный код на C мало напоминает тот, который приводится 
в предлагаемых примерах.
Эта книга начинается там, где другие заканчиваются. Сам язык и окружающая 
его экосистема подвергаются пересмотру. Основная сюжетная линия – как пользоваться библиотеками для работы со связанными списками и анализаторами 
XML, а не разрабатывать собственные с нуля. Это книга о том, как писать удобочитаемый код с дружественным пользователю программным интерфейсом.

Предисловие  13

В. На кого рассчитана эта книга? На экспертов по кодированию?
О. Предполагается, что у вас есть опыт кодирования на каком-нибудь языке, 
к примеру на Java или скриптовом языке типа Perl. Я не собираюсь объяснять, 
почему программа не должна быть одной длинной процедурой, не разбитой на 
функции.
В тексте книги предполагается, что читатель обладает базовыми знаниями о C, 
приобретенными в процессе написания кода на этом языке. Для тех, кто подзабыл 
детали или вообще начинает с азов, в приложении А приводится краткий справочник по основам C, рассчитанный на владеющих такими скриптовыми языками, 
как Python или Ruby.
Наверное, стоит упомянуть, что я написал также учебник по статистическим и 
научным расчетам «Modeling with Data» [Klemens 2008]. Помимо многочисленных деталей, относящихся к численным методам и использованию статистических моделей для описания данных, там имеется более развернутое и независимое 
руководство по C, в котором, надеюсь, мне удалось преодолеть многие недостатки 
прежних руководств.
В. Я прикладной программист и не собираюсь копаться в ядре. Зачем мне 
писать на C, а не на скриптовом языке Python, на котором программировать 
куда быстрее?
О. Если вы прикладной программист, то эта книга как раз для вас. Сколько раз 
я слышал утверждение, будто C – язык системного программирования; оно страшно далеко от панковского склада ума – да кто они такие, чтобы указывать нам, что 
можно писать, а что – нет?
Высказывания типа «наш язык почти такой же быстрый, как C, но писать на нем 
проще» уже набили оскомину. Понятно же, что сам C такой же быстрый, как C, 
а задача этой книги – убедить вас в том, что писать на нем проще, чем это следует 
из книг десятилетней давности. Вызывать malloc и забираться в дебри управления 
памятью вам придется даже вполовину не так часто, как системному программисту 1990-х годов. У нас теперь есть простые средства для работы со строками, и 
даже базовый синтаксис изменился, чтобы сделать код понятнее.
Я всерьез начал писать на C, когда понадобилось ускорить программу моделирования, написанную на скриптовом языке R. Как и многие другие скриптовые языки, R имеет интерфейс к C, которым предлагается пользоваться всякий 
раз, как включающий язык оказывается слишком медленным. В конечном итоге я 
переписал на C так много функций, что от включающего языка вообще отказался.
В. То, что эта книга понравится прикладным программистам с опытом работы на скриптовых языках, конечно, прекрасно, но я-то занимаюсь кодом ядра. 
Я выучил C в пятом классе, у меня даже сны иногда успешно компилируются. 
Что тут для меня может быть нового?
О. Последние 20 лет C не стоял на месте. Ниже я расскажу о том, как изменилась функциональность, гарантированно поддерживаемая любым компилятором, – благодаря двум новым стандартам C, вышедшим со времен оригинального 
стандарта ANSI. Загляните в главу 10, может статься, кое-что в ней вас удивит. 

 Предисловие

В некоторых частях книги, например в главе 6, развенчивающей широко распространенные ошибочные представления об указателях, рассматриваются вещи, изменившиеся с 1980-х годов.
Прогресс затронул и окружение. Многие рассматриваемые мной инструменты, 
например make и отладчик, вам, наверное, знакомы, но есть другие, не столь хорошо 
известные. Комплект инструментов Autotools полностью изменил представление 
о распространении кода, а система управления версиями Git знаменует новый 
подход к коллективной разработке кода.
В. Не могу не отметить, что примерно в трети книги вообще нет кода на C.
О. Цель этой книги – рассмотреть то, чего нет в других учебниках C, а первым номером в этом списке стоят инструменты и окружение. Если вы не пользуетесь отладчиком (автономным или входящим в IDE), то заметно усложняете себе 
жизнь. Во многих учебниках отладчик вынесен куда-то на задворки, если вообще 
упоминается. Для совместной работы над кодом нужен другой комплект инструментов, включающий среди прочего Autotools и Git. Код существует не в вакууме, 
и я полагал, что окажу читателям дурную услугу, написав еще одну книгу, основанную на предпосылке, будто знание синтаксиса – это все, что необходимо для 
продуктивного использования языка.
В. Есть много средств для разработки программ на C. Какими критериями вы 
руководствовались при отборе?
О. Сообщество пользователей C в большей степени, чем многие другие, озабочено следованием стандартам интероперабельности. Существует масса расширений C, предлагаемых в среде GNU, есть интегрированные среды (IDE), которые 
работают только в Windows, а также расширения компилятора, доступные лишь 
в LLVM (Low Level Virtual Machine – низкоуровневая виртуальная машина). Быть 
может, именно поэтому авторы прежних учебников боялись затрагивать тему инструментальных средств. Но в наши дни существуют системы, которые работают 
на всем, что мы обычно считаем компьютером. Многие являются частью проекта 
GNU ; LLVM со своим инструментарием быстро набирают популярность, но пока 
еще не являются преобладающими. Где бы вы ни работали – в Windows, в Linux, на 
экземпляре, только что полученном от поставщика облачных вычислений, – рассматриваемые здесь инструменты можно будет установить легко и быст ро. Я упомяну о нескольких платформенно-зависимых инструментах, но всякий раз буду 
явно отмечать это.
Я не рассматриваю интегрированных сред разработки (IDE), потому что вряд 
ли найдутся такие, которые надежно работают на любой платформе (попробуйте 
поставить Eclipse и подключаемые к ней модули для С на экземпляр Amazon Elastic 
Compute Cloud), да к тому же выбор IDE в высшей степени субъективен. В состав 
типичной IDE входит система сборки проектов, которая обычно несовмес тима 
с аналогичной системой сборки из другой IDE. Поэтому файлы проектов IDE невозможно использовать для распространения проекта; исключением являются 
случаи, когда все заинтересованные лица обязаны работать с одной и той же IDE 
(учебные курсы, некоторые офисы, некоторые вычислительные платформы).

Предисловие  15

В. У меня есть Интернет. Чтобы посмотреть справку по команде или нюансы 
синтаксиса, хватит пары секунд, так зачем мне читать книгу?
О. Истинная правда: чтобы посмотреть таблицу приоритетов операторов в системе Linux или Mac, достаточно набрать команду man operator. Почему же тогда я 
привожу ее в книге?
У меня точно такой же Интернет, как у вас, и я немало времени провожу в нем, 
читая разные материалы. Поэтому я прекрасно знаю, о чем там не пишут, и это 
именно то, что я включил в книгу. Описывая новый инструмент, например gprof 
или GDB, я сообщаю то, что необходимо знать, чтобы сориентироваться и задать 
поисковой системе разумные вопросы, а также то, о чем умалчивают другие учебники (а это ой как много).

Стандарты: как много девушек хороших

 Если явно не оговорено противное, весь код в книге соответствует стандартам 
ISO C99 и C11. Чтобы вы понимали, о чем идет речь, будет уместно дать краткий 
исторический обзор и перечислить основные стандарты языка C (опуская мелкие 
редакционные правки и исправления).

K & R (примерно 1978) 
Деннис Ричи, Кен Томпсон и ряд сподвижников придумали язык для написания операционной системы Unix . Впоследствии Брайан Керниган и Деннис Ричи привели описание языка в первом издании своей книги. Это и был 
первый стандарт де-факто [Kernighan 1978].

ANSI C89 
Компания Bell Labs передала курирование языка Американскому национальному институту стандартов (ANSI). В 1989-м был опубликован первый 
стандарт, содержавший ряд усовершенствований, по сравнению с K&R. Во 
второе издание книги K&R была включена полная спецификация языка, 
а это означало, что на рабочих столах десятков тысяч программистов появился экземпляр стандарта ANSI [Kernighan 1988]. В 1990 году стандарт 
ANSI был принят Международной организацией по стандартизации (ИСО) 
без существенных изменений, но ANSI 89 употребляется чаще (и встречается на футболках).

Прошло десять лет. Язык C стал общепринятым в том смысле, что базовый код 
практически всех ПК и всех интернет-серверов написан на C; пожалуй, трудно вообразить более «общепринятое» творение человеческого разума.
За это время от C откололся C++ и добился значительного успеха (хотя и не 
такого значительного, как C). Появление C++ стало лучшим, что когда-либо происходило с C. В то время как другие языки обзаводились дополнительными синтаксическими конструкциями, чтобы следовать в русле объектной ориентированности, и всякими другими фенечками, приходившими на ум их авторам, C строго 
придерживался стандарта. Те, кто хотел стабильности и переносимости, писали 

 Предисловие

на C. Те же, кому были нужны все новые и новые возможности, чтобы купаться 
в них, как в ванне с шампанским, получили в свое распоряжение C++. И все были 
счастливы.

ISO C99
Спустя десять лет C подвергся существенному пересмотру. Были добавлены 
средства для численных и научных расчетов, стандартный тип комплексных чисел и некоторые подобия обобщенных функций, адаптирующихся 
к типу аргументов. Включены некоторые удобные средства C++, включая 
однострочные комментарии (впервые появившиеся в предшественнике C – 
языке BCPL) и возможность объявлять переменные в заголовке цикла for. 
Упрощена работа со структурами – благодаря новым правилам объявления 
и инициализации и некоторым нотационным усовершенствованиям. Признано, что безопасность – не последнее дело и что не все в мире говорят поанглийски, и это тоже оказало влияние на модернизацию языка.
Размышляя о том, сколько нового появилось в стандарте C89, и учитывая, 
что нет в мире компьютера, где бы не работал код на C, трудно представить, 
что ИСО мог придумать нечто такое, что не подверглось бы ожесточенной 
критике, – его ругали даже за отказ вносить те или иные изменения. И нельзя не признать, что стандарт оказался противоречивым. Существует два общепринятых способа представить комплексное число (в прямоугольных и 
в полярных координатах) – так почему ИСО отдал предпочтение только одному? Зачем нужен механизм макросов с переменным числом аргументов, 
если код прекрасно можно писать и без него? Иными словами, блюстители 
чистоты идеи обвиняли ИСО в том, что тот уступил давлению со стороны жаждущих новой функциональности. В настоящее время большинство 
компиляторов поддерживают C99 с некоторыми оговорками, например 
серьезные трудности вызывает тип long double. Однако есть одно заметное 
исключение из этого широкого консенсуса: корпорация Майкрософт отказывается включать поддержку C99 в свой компилятор Visual Studio C++. 
В разделе «Компиляция кода на C в Windows» ниже мы увидим некоторые 
из многочисленных способов откомпилировать код в Windows, так что отказ от Visual Studio – не более чем неудобство, а желание крупного рыночного игрока запретить нам использование стандартов ANSI и ISO только 
укрепляет дух панк-рока, свойственный C.

C11 
Сознавая справедливость обвинений в уступке давлению, ИСО внес серьезные изменения в третью редакцию стандарта. Стало возможно писать обобщенные функции, дальнейшее развитие получили также идеи безопасности 
и интернационализации.
Стандарт C11 вышел в декабре 2011 года, но разработчики компиляторов 
на удивление быстро поддержали его. Сейчас большинство основных компиляторов заявляет о почти полном соответствии. Однако стандарт опреде