C99

C99 — стандарт мови програмування Сі. Визначений в ISO/IEC 9899:1999, сучасна версія — ISO/IEC 9899:1999/Cor 3: 2007 від 2007-11-15. Є розвитком стандарту C90.

Історія

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

Нові можливості

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

  • Вбудовувані функції[en] (оголошені з ключовим словом inline).
  • Місце, в якому можливе оголошення змінних, більше не обмежене глобальною областю видимості та початком складеного оператора (блоку).
  • Декілька нових типів даних, зокрема long long int, додаткові розширені цілі типи, явний логічний тип даних, а також комплексний тип (complex) для подання комплексних чисел.
  • Масиви змінної довжини[en].
  • Підтримка однорядкових коментарів, що починаються з // як у 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[en] підтримує основні особливості 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 робоча група зі стандартизації підготувала технічний звіт, що містить такі покращення: покращена підтримка вбудованої обробки, додаткові символьні типи даних (підтримка Юнікоду), бібліотечні функції з покращеною перевіркою допустимих значень. Продовжується робота і над технічними звітами, пов'язаними з десятковими числами з рухомою комою, додатковими математичними спеціальними функціями та додатковими функціями для роботи з динамічно розподілюваною пам'яттю. Комітети зі стандартизації Сі та C++ спільно працюють над специфікаціями для багатониткового програмування.

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

Найпевніше, стандартну функцію gets, яку офіційно визнано нерекомендованою до використання через численні звіти про проблеми щодо небезпечно спроєктованого інтерфейсу, не буде включено до наступної ревізії стандарту мови Сі.

Див. також

Примітки

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

Посилання

  • Чернетка стандарту C99 з поправками TC1, TC2 і TC3PDF (3.61 MB)
  • IBM developerWorks: опенсорсна розробка з урахуванням C99 [Архівовано 29 січня 2009 у Wayback Machine.]
Перегляд цього шаблону
  Словники та енциклопедії
BabelNet
Нормативний контроль
Freebase: /m/047vl7n
  • п
  • о
  • р
Мова програмування C
Бібліотеки
Можливості мови
  • Рядки
  • Синтаксис
  • Препроцесор
  • Типи даних та оголошення змінних у C
  • Функції
Нащадки
C та інші мови
Категорія Категорія