WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

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 было добавлено несколько новых возможностей, многие из которых уже были реализованы в качестве расширения в некоторых компиляторах.

  • Встраиваемые функции (объявленные с ключевым словом inline).
  • Место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока).
  • Несколько новых типов данных, включая long long int, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип (complex) для представления комплексных чисел.
  • Массивы переменной длины (variable-length arrays).
  • Поддержка однострочных комментариев, начинающихся с //, как в 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, которая была официально признана нерекомендуемой к использованию из-за многочисленных отчётов о проблемах касательно небезопасно спроектированного интерфейса, не будет включена в следующую ревизию стандарта языка Си.

См. также

Примечания

  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 года.

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


Предшественник:
C89
Стандарты языка Си
Преемник:
C1X

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии