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

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

См. также

Напишите отзыв о статье "C99"

Примечания

  1. [gcc.gnu.org/c99status.html Статус поддержки нововведений стандарта C99 в GCC]. Free Software Foundation, Inc. (22 ноября 2007). Проверено 9 января 2008. [www.webcitation.org/66HcHZJVX Архивировано из первоисточника 19 марта 2012].
  2. [developers.sun.com/sunstudio/documentation/ss12/mr/READMEs/c.html#about Sun Studio 12: C Compiler 5.9 Readme]. Sun Microsystems, Inc. (31 мая 2007). Проверено 9 января 2008. [www.webcitation.org/66HcI217s Архивировано из первоисточника 19 марта 2012].
  3. [www.softintegration.com/demos/chstandard/c99.html C/C++ interpreter Ch C99 features]. SoftIntegration, Inc. (15 февраля 2008). Проверено 15 февраля 2008. [www.webcitation.org/66HcIWJHH Архивировано из первоисточника 19 марта 2012].

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

  • [www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf Черновик стандарта C99 с поправками TC1, TC2 и TC3]PDF (3.61 MB)
  • [www.ibm.com/developerworks/library/l-c99.html IBM developerWorks: Опенсорсная разработка с учётом C99]
  • [www.kuro5hin.org/story/2001/2/23/194544/139 Kuro5hin: Вы Готовы к C99?]


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

Отрывок, характеризующий C99

Во время короткого визита Николая, как и всегда, где есть дети, в минуту молчания Николай прибег к маленькому сыну князя Андрея, лаская его и спрашивая, хочет ли он быть гусаром? Он взял на руки мальчика, весело стал вертеть его и оглянулся на княжну Марью. Умиленный, счастливый и робкий взгляд следил за любимым ею мальчиком на руках любимого человека. Николай заметил и этот взгляд и, как бы поняв его значение, покраснел от удовольствия и добродушно весело стал целовать мальчика.
Княжна Марья не выезжала по случаю траура, а Николай не считал приличным бывать у них; но губернаторша все таки продолжала свое дело сватовства и, передав Николаю то лестное, что сказала про него княжна Марья, и обратно, настаивала на том, чтобы Ростов объяснился с княжной Марьей. Для этого объяснения она устроила свиданье между молодыми людьми у архиерея перед обедней.
Хотя Ростов и сказал губернаторше, что он не будет иметь никакого объяснения с княжной Марьей, но он обещался приехать.
Как в Тильзите Ростов не позволил себе усомниться в том, хорошо ли то, что признано всеми хорошим, точно так же и теперь, после короткой, но искренней борьбы между попыткой устроить свою жизнь по своему разуму и смиренным подчинением обстоятельствам, он выбрал последнее и предоставил себя той власти, которая его (он чувствовал) непреодолимо влекла куда то. Он знал, что, обещав Соне, высказать свои чувства княжне Марье было бы то, что он называл подлость. И он знал, что подлости никогда не сделает. Но он знал тоже (и не то, что знал, а в глубине души чувствовал), что, отдаваясь теперь во власть обстоятельств и людей, руководивших им, он не только не делает ничего дурного, но делает что то очень, очень важное, такое важное, чего он еще никогда не делал в жизни.
После его свиданья с княжной Марьей, хотя образ жизни его наружно оставался тот же, но все прежние удовольствия потеряли для него свою прелесть, и он часто думал о княжне Марье; но он никогда не думал о ней так, как он без исключения думал о всех барышнях, встречавшихся ему в свете, не так, как он долго и когда то с восторгом думал о Соне. О всех барышнях, как и почти всякий честный молодой человек, он думал как о будущей жене, примеривал в своем воображении к ним все условия супружеской жизни: белый капот, жена за самоваром, женина карета, ребятишки, maman и papa, их отношения с ней и т. д., и т. д., и эти представления будущего доставляли ему удовольствие; но когда он думал о княжне Марье, на которой его сватали, он никогда не мог ничего представить себе из будущей супружеской жизни. Ежели он и пытался, то все выходило нескладно и фальшиво. Ему только становилось жутко.


Страшное известие о Бородинском сражении, о наших потерях убитыми и ранеными, а еще более страшное известие о потере Москвы были получены в Воронеже в половине сентября. Княжна Марья, узнав только из газет о ране брата и не имея о нем никаких определенных сведений, собралась ехать отыскивать князя Андрея, как слышал Николай (сам же он не видал ее).
Получив известие о Бородинском сражении и об оставлении Москвы, Ростов не то чтобы испытывал отчаяние, злобу или месть и тому подобные чувства, но ему вдруг все стало скучно, досадно в Воронеже, все как то совестно и неловко. Ему казались притворными все разговоры, которые он слышал; он не знал, как судить про все это, и чувствовал, что только в полку все ему опять станет ясно. Он торопился окончанием покупки лошадей и часто несправедливо приходил в горячность с своим слугой и вахмистром.
Несколько дней перед отъездом Ростова в соборе было назначено молебствие по случаю победы, одержанной русскими войсками, и Николай поехал к обедне. Он стал несколько позади губернатора и с служебной степенностью, размышляя о самых разнообразных предметах, выстоял службу. Когда молебствие кончилось, губернаторша подозвала его к себе.
– Ты видел княжну? – сказала она, головой указывая на даму в черном, стоявшую за клиросом.
Николай тотчас же узнал княжну Марью не столько по профилю ее, который виднелся из под шляпы, сколько по тому чувству осторожности, страха и жалости, которое тотчас же охватило его. Княжна Марья, очевидно погруженная в свои мысли, делала последние кресты перед выходом из церкви.
Николай с удивлением смотрел на ее лицо. Это было то же лицо, которое он видел прежде, то же было в нем общее выражение тонкой, внутренней, духовной работы; но теперь оно было совершенно иначе освещено. Трогательное выражение печали, мольбы и надежды было на нем. Как и прежде бывало с Николаем в ее присутствии, он, не дожидаясь совета губернаторши подойти к ней, не спрашивая себя, хорошо ли, прилично ли или нет будет его обращение к ней здесь, в церкви, подошел к ней и сказал, что он слышал о ее горе и всей душой соболезнует ему. Едва только она услыхала его голос, как вдруг яркий свет загорелся в ее лице, освещая в одно и то же время и печаль ее, и радость.
– Я одно хотел вам сказать, княжна, – сказал Ростов, – это то, что ежели бы князь Андрей Николаевич не был бы жив, то, как полковой командир, в газетах это сейчас было бы объявлено.
Княжна смотрела на него, не понимая его слов, но радуясь выражению сочувствующего страдания, которое было в его лице.
– И я столько примеров знаю, что рана осколком (в газетах сказано гранатой) бывает или смертельна сейчас же, или, напротив, очень легкая, – говорил Николай. – Надо надеяться на лучшее, и я уверен…
Княжна Марья перебила его.
– О, это было бы так ужа… – начала она и, не договорив от волнения, грациозным движением (как и все, что она делала при нем) наклонив голову и благодарно взглянув на него, пошла за теткой.
Вечером этого дня Николай никуда не поехал в гости и остался дома, с тем чтобы покончить некоторые счеты с продавцами лошадей. Когда он покончил дела, было уже поздно, чтобы ехать куда нибудь, но было еще рано, чтобы ложиться спать, и Николай долго один ходил взад и вперед по комнате, обдумывая свою жизнь, что с ним редко случалось.
Княжна Марья произвела на него приятное впечатление под Смоленском. То, что он встретил ее тогда в таких особенных условиях, и то, что именно на нее одно время его мать указывала ему как на богатую партию, сделали то, что он обратил на нее особенное внимание. В Воронеже, во время его посещения, впечатление это было не только приятное, но сильное. Николай был поражен той особенной, нравственной красотой, которую он в этот раз заметил в ней. Однако он собирался уезжать, и ему в голову не приходило пожалеть о том, что уезжая из Воронежа, он лишается случая видеть княжну. Но нынешняя встреча с княжной Марьей в церкви (Николай чувствовал это) засела ему глубже в сердце, чем он это предвидел, и глубже, чем он желал для своего спокойствия. Это бледное, тонкое, печальное лицо, этот лучистый взгляд, эти тихие, грациозные движения и главное – эта глубокая и нежная печаль, выражавшаяся во всех чертах ее, тревожили его и требовали его участия. В мужчинах Ростов терпеть не мог видеть выражение высшей, духовной жизни (оттого он не любил князя Андрея), он презрительно называл это философией, мечтательностью; но в княжне Марье, именно в этой печали, выказывавшей всю глубину этого чуждого для Николая духовного мира, он чувствовал неотразимую привлекательность.