C99

C99 — стандарт языка программирования Си. Определен в ISO/IEC 9899:1999, современная версия - ISO/IEC 9899:1999/Cor 3:2007 от 2007-11-15. Является развитием стандарта C90.

История править

После процесса стандартизации ANSI спецификация языка Си некоторое время оставалась относительно неизменной, тогда как C++ продолжал развиваться, особенно во время его стандартизации. Нормативная поправка 1 создала новый стандарт языка Си в 1995 году, но только с точки зрения исправления некоторых деталей стандарта C89 и добавления расширенной поддержки интернациональных наборов символов. Тем не менее, стандарт подвергся дальнейшей ревизии в конце 1990-х, что привело к публикации стандарта ISO/IEC 9899:1999 в 1999 году. Этот стандарт часто упоминается как «C99». Он был принят в качестве стандарта ANSI в мае 2000 года. Международный стандарт Си поддерживается рабочей группой ISO/IEC JTC1/SC22/WG14.

Новые возможности править

В C99 было добавлено несколько новых возможностей, многие из которых уже были реализованы в качестве расширения в некоторых компиляторах.

  • Встраиваемые функции[en] (объявленные с ключевым словом inline).
  • Место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока).
  • Несколько новых типов данных, включая long long int, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип (complex) для представления комплексных чисел.
  • Массивы переменной длины.
  • Поддержка однострочных комментариев, начинающихся с //, как в BCPL или C++.
  • Новые библиотечные функции, как, например, snprintf.
  • Новые заголовочные файлы, такие как stdbool.h и inttypes.h.
  • Типовые математические функции (tgmath.h).
  • Улучшена поддержка стандарта IEEE 754-2008.
  • Составные константы (например, стало возможным определять структуры прямо в вызове функции: function((struct point){4,2})).
  • Новые инициализаторы для массивов и структур (int а[10] = { [0] = 100, [3] = 200}; struct mystruct {int a; int b; int c;} ob = { .c = 30, .a = 10 };).
  • Поддержка вариативных макросов (макросов переменной арности).
  • Смягчение (restrict) ограничений для более агрессивной оптимизации кода.

Обратная совместимость с C90 править

C99 является большей частью обратно совместимым с C90, но вместе с тем в некоторых случаях является более жёстким. В частности, объявление без указания типа больше не подразумевает неявное задание типа int. Комитет по стандартизации языка Си решил, что для компиляторов будет более важным определять пропуск по невнимательности указания типа, чем «тихая» обработка старого кода, полагавшаяся на неявное указание int. На практике же, компиляторы могли определять неуказание, но также допускали, что это int и продолжали компиляцию программы.

Поддержка распространёнными компиляторами править

GCC и другие компиляторы языка Си поддерживают многие нововведения стандарта C99. Тем не менее, ощущается недостаточная поддержка стандарта со стороны крупных производителей средств разработки, таких как Microsoft и Borland, которые сосредоточились, в основном, на языке C++, так как C++ обеспечивает функциональность, схожую с предоставляемой нововведениями стандарта.

GCC, невзирая на его расширенную поддержку C99, все ещё является не полностью совместимой реализацией: некоторые особенности не реализованы или работают некорректно.[1]

Согласно Sun Microsystems, Sun Studio 9 и выше (которое доступно для свободного скачивания) сертифицирована под стандарт C99, для процессоров UltraSPARC, Intel x86, AMD 64.[2] Также сертифицирована IBM XL C/C++, для процессоров Power PC. Есть сертифицированные трансляторы других фирм. Интерпретатор языка Си Ch поддерживает основные особенности C99 [3] и свободно доступен в версиях для Windows, Linux, Mac OS X, Solaris, QNX и FreeBSD.

Определение версии править

Стандартный макрос __STDC_VERSION__, определенный со значением 199901L, указывает, что поддержка C99 доступна. Как и макрос __STDC__ для C90, макрос __STDC_VERSION__ может быть использован для написания кода, который будет компилироваться компиляторами C90 и C99 по-разному. Ниже приведен пример, в котором с помощью макроса __STDC_VERSION__ проверяется, является ли inline ключевым словом.

#if __STDC_VERSION__ >= 199901L
  /* "inline" is a keyword */
#else
#define inline /* nothing */
#endif

Направления развития стандарта править

После ратификации стандарта C99 рабочая группа по стандартизации подготовила технический отчёт, содержащий следующие улучшения: улучшенная поддержка встроенной обработки, дополнительные символьные типы данных (поддержка Unicode), библиотечные функции с улучшенной проверкой допустимых значений. Продолжается работа и над техническими отчётами, связанными с десятичными числами с плавающей запятой, дополнительными математическими специальными функциями и дополнительными функциями для работы с динамически распределяемой памятью. Комитеты по стандартизации Си и C++ совместно работают над спецификациями для многопоточного программирования.

В 2007 началась работа над заготовкой новой ревизии стандарта языка Си, неофициально называемой «C1x». Комитет по стандартизации языка Си поддержал стратегию, которая должна ограничить включение новых наработок, не «обкатанных» существующими реализациями.

Скорее всего, стандартная функция gets, которая была официально признана нерекомендуемой к использованию из-за многочисленных отчётов о проблемах касательно небезопасно спроектированного интерфейса, не будет включена в следующую ревизию стандарта языка Си.

См. также править

  • ANSI C
  • C11 — следующая спецификация языка

Примечания править

  1. Статус поддержки нововведений стандарта C99 в GCC. Free Software Foundation, Inc. (22 ноября 2007). Дата обращения: 9 января 2008. Архивировано из оригинала 19 марта 2012 года.
  2. Sun Studio 12: C Compiler 5.9 Readme. Sun Microsystems, Inc. (31 мая 2007). Дата обращения: 9 января 2008. Архивировано из оригинала 19 марта 2012 года.
  3. C/C++ interpreter Ch C99 features. SoftIntegration, Inc. (15 февраля 2008). Дата обращения: 15 февраля 2008. Архивировано из оригинала 19 марта 2012 года.

Дополнительные источники править