Interested Article - 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 года. Международный стандарт Си поддерживается /WG14.

Новые возможности

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

  • (объявленные с ключевым словом 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, все ещё является не полностью совместимой реализацией: некоторые особенности не реализованы или работают некорректно.

Согласно Sun Microsystems , Sun Studio 9 и выше (которое доступно для свободного скачивания) сертифицирована под стандарт C99, для процессоров UltraSPARC, Intel x86, AMD 64. Также сертифицирована IBM XL C/C++, для процессоров Power PC. Есть сертифицированные трансляторы других фирм. Интерпретатор языка Си поддерживает основные особенности C99 и свободно доступен в версиях для 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 началась работа над заготовкой новой ревизии стандарта языка Си, неофициально называемой «C1 x ». Комитет по стандартизации языка Си поддержал стратегию, которая должна ограничить включение новых наработок, не «обкатанных» существующими реализациями.

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

См. также

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

Примечания

  1. . Free Software Foundation, Inc. (22 ноября 2007). Дата обращения: 9 января 2008. Архивировано из 19 марта 2012 года.
  2. . Sun Microsystems, Inc. (31 мая 2007). Дата обращения: 9 января 2008. Архивировано из 19 марта 2012 года.
  3. . SoftIntegration, Inc. (15 февраля 2008). Дата обращения: 15 февраля 2008. Архивировано из 19 марта 2012 года.

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

Источник —

Same as C99