Отличия между С99 и С89 можно разбить на три общие категории:
- новые возможности, добавленные к С89
- возможности, удаленные из С89
- возможности, которые были изменены или расширены
Многие из отличий между С89 и С99 достаточно незначительны и относятся лишь к нюансам языка. А в этой книге основное внимание уделяется достаточно заметным изменениям — заметным настолько, чтобы влиять на способ написания программ.
Новые возможности
Скорее всего, самыми заметными из новых средств, которых не было в С89, являются те, которые связаны с использованием новых ключевых слов:
inline
restrict
_Bool
_Complex
_Imaginary
К другим важным новинкам относятся:
- массивы переменной длины
- поддержка арифметических операций с комплексными числами
- тип данных long long int
- комментарий /
- возможность распределять код и данные
- добавления к препроцессору
- объявления переменных внутри оператора for
- составные литералы
- массивы с переменными границами в качестве членов структур
- назначенные инициализаторы
- изменения в семействе функций printf() и scanf()
- зарезервированный идентификатор __func__
- новые библиотеки и заголовки
Большинство возможностей были созданы комитетом по стандартизации, причем многие из этих возможностей созданы с учетом расширений языка, имеющихся в разных реализациях языка С. Впрочем, в некоторых случаях возможности были позаимствованы у C++, как, например, ключевое слово inline и комментарии вида /. Важно понять, что при создании С99 не были добавлены классы в стиле C++, наследование и функции-члены. В том, что С должен остаться С — в этом комитет по стандартизации был единодушен.
Удаленные средства
Самым заметным «излишеством», удаленным при создании С99, было правило «неявного int«. В С89 во многих случаях, когда не было явного указания типа данных, подразумевался тип int. А в С99 такое не допускается. Также удалено неявное объявление функций. В С89, если функция перед использованием не объявлялась, то подразумевалось неявное объявление. А в С99 такое не поддерживается. Если программа должна быть совместима с С99, то из-за двух этих изменений, возможно, придется немного подправить код.
Измененные средства
При создании С99 было сделано несколько изменений имевшихся средств. По большей части, эти изменения расширяют возможности или вносят определенную ясность в их значение. И только в небольшом количестве случаев изменения ограничивают или сужают применение средства. Многие изменения небольшие, однако некоторые из них являются достаточно важными, в том числе:
- уменьшение ограничений транслятора
- новые целые типы
- расширение правил продвижения целых типов
- более строгие правила употребления оператора return
Что касается влияния этих изменений на уже написанные программы, то самое значительный эффект имеет изменение правил употребления оператора return, из-за чего код, возможно, придется немного подправить.
В оставшейся части этой главы мы изучим основные различия между С89 и С99.