Статус международного стандарта языка си

Обновлено: 18.09.2024

Различные страны имеют изменяющиеся стандарты. Эти стандарты содержит преобразования от очень простых, типа формата для представления дат и времени, до очень сложных, типа разговорного языка.

Межнационализация программного обеспечения означает способность к адаптированию программирования для соглашений предпочитаемых пользователем. В ANSI C, межнационализация работает посредством стандартов. Каждый стандарт определяет набор соглашений, одно соглашение для каждой цели. Пользователь выбирает набор соглашений, определяя стандарт (через переменные среды).

Все программы наследуют выбранный стандарт как часть их среды.

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

Самый простой способ для пользователя, чтобы выбрать стандарт состоит в том, чтобы установить переменную среды LANG. Она определяет один стандарт для всех целей. Например, пользователь мог бы определить гипотетический стандарт, именованный " espana­ castellano " чтобы использовать стандартные соглашения Испании.

Набор обеспечиваемых стандартов зависит от операционной системы, которую Вы используете. Мы не можем делать ни каких обещаний относительно того, что стандарты будут существовать, кроме одного стандартного стандарта, называемого " C " или " POSIX ".

Пользователь также имеет опцию определения различных стандартов для различных целей, выбирая смесь многих стандартов.

Цели, которые стандарты обслуживают, сгруппированы в категории так, чтобы пользователь или программа мог выбирать стандарт для каждого класса независимо. Вот таблица категорий: каждое имя является и переменной среды, которую пользователь может устанавливать, и именем макрокоманды, которую Вы можете использовать как аргумент setlocale.

Этот класс применяется для объединения строк (функции strcoll и strxfrm); см. Раздел 5.6 [Функции Объединения]. Этот класс применяется для классификации и преобразований символов, и в многобайтовые и в расширенные символы; см. Главу 4 [Обработка Символов] и Главу 18 [Расширенные Символы]. Этот класс применяется к форматированию валютных значений; см. Раздел 19.6 [Числовое форматирование]. Этот класс применяется к форматированию числовых значений; см. раздел 19.6 [Числовое Форматирование]. Этот класс применяется для форматирования значений даты и времени; см. Раздел 17.2.4 [Форматирование Даты и времени]. Это - не переменная среды, это - только макрокоманда, которую Вы можете использовать с setlocale, чтобы установить одиночный стандарт для всех целей. Если эта переменная среды определена, значение определяет стандарт, используемый для всех целей за исключением того, как отменено переменными выше.

Программа на Си наследует переменные среды стандарта, когда она начинается. Это случается автоматически. Однако, эти переменные автоматически не управляют стандартом, используемым в соответствии c библиотечными функциями, потому что ANSI C говорит, что все программы начинаются по умолчанию в стандарте " C ". Чтобы использовать стандарты, заданные средой, Вы должны вызвать setlocale. Вызовите ее следующим образом:

чтобы выбрать стандарт, основанный на соответствующих переменных среды.

Вы можете также использовать setlocale, чтобы определить специфический стандарт, для общего использования или для специфического класса.

Символы в этом разделе определены в заглавном файле " locale.h".

Функция setlocale устанавливает текущий стандарт для указанного класса.

Если класс - LC_ALL, то она определяет стандарт для всех целей. Другие возможные значения класса определяют индивидуальную цель (см. Раздел 19.3 [Категории Стандарта] ).

Вы можете также использовать эту функцию, чтобы выяснить текущий стандарт, передавая пустой указатель как аргумент стандарта. В этом случае, setlocale возвращает строку, которая является именем стандарта, в настоящее время выбранного для класса class.

Строка, возвращенная setlocale может быть записана поверх последующими обращениями, так что Вы должны делать копию строки (см. Раздел 5.4 [Копирование и Конкатенация]) если Вы хотите сохранять ее после любых дальнейших обращений к setlocale. (Стандартная библиотека, как гарантируют, никогда не вызовет setlocale непосредственно.)

Вы не должны изменять строку, возвращенную setlocale. Это может быть та же самая строка, которая была передана как аргумент в предыдущем обращении к setlocale.

Когда Вы читаете текущий стандарт для класса LC_ALL, значение кодирует всю комбинацию выбранных стандартов для всех категорий. В этом случае, значение не только одиночное имя стандарта. Фактически, мы не делаем ни каких обещаний относительно того, на что это походит. Но если Вы определяете то же самое " имя стандарта" LC_ALL в последующем обращении к setlocale, она восстанавливает ту же самую комбинацию выборов стандарта.

Когда аргумент locale - не пустой указатель, строка, возвращенная setlocale отражает изменяемый стандарт.

Если Вы определяете пустую строку для стандарта, это означает, что нужно читать соответствующую переменную среды и использовать ее значение для установки стандарта указанного класса.

Если Вы определяете недопустимое имя стандарта, setlocale, возвращает пустой указатель и оставляет текущий стандарт неизмененным.

Вот пример, показывающий, как Вы могли бы использовать setlocale, чтобы временно включить к новый стандарт.

Примечание о переносимости: Некоторые системы ANSI C могут определять дополнительные категории стандарта. Для переносимости, запомните, что любой символ, начинающийся с " LC_ " мог бы быть определен в "locale.h".

Единственые имена стандартов, которые Вы можете находить во всех операционных системах - это три стандартных: "C" Это - стандартный стандарт Cи. Атрибуты и поведение, которое он обеспечивает определены в стандарте ANSI C. Когда ваша программа начинается, она первоначально использует этот стандарт по умолчанию. " POSIX " Это - стандартный стандарт POSIX. В настоящее время, это - побочный результат исследования для стандартного стандарта Cи. "" Пустое имя говорит о том, что нужно выбрать стандарт, основанный на переменных среды. См. Раздел 19.3 [Категории Стандарта].

Определение и установка стандартов - обязаность вашего администратора системы (или человека, который установил библиотеку GNU C). Некоторые системы могут позволять пользователям создавать стандарты, но мы не обсуждаем это здесь.

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

Когда Вы хотите форматировать число или количество валюты, используя соглашения текущего стандарта, Вы можете использовать функцию localeconv, чтобы получить данные относительно того, как делать это. Функция localeconv объявлена в заглавном файле "locale.h ".

Функция localeconv возвращает указатель на структуру, чьи компоненты содержат информацию относительно того, как числовые и валютные значения должны форматироваться в текущем стандарте.

Вы не должны измениять структуру или ее содержимое. Структура может быть записана поверх последующими обращениями к localeconv, или обращениями к setlocale, но никакая другая функция в библиотеке не записывает поверх этого значения.

Это - тип данных значения, возвращенного localeconv.

Если элемент структуры struct lconv имеет тип char, и значение ­ CHAR_MAX, это означает что текущий стандарт не имеет никакого значения для этого параметра.

Обобщенные Параметры Числового Форматирования

Это - стандартные элементы struct lconv; хотя могут иметься и другие.

Это - разделители Десятичных точек, используемые в форматировании невалютных и валютных чисел, соответственно. В "C" стандарте, значение decimal_point - ".", а значение mon_decimal_point - "". Это - разделители, используемые, чтобы разграничить группы цифр налево от десятичной точки при форматировании невалютных и валютных чисел, соответственно. В "C" стандарте, оба элемента имеет значение "" (пустая строка). Это - строки, которые определяют, как группировать цифры налево от десятичной точки. Группировка grouping применяется к невалютным количествам, а mon_grouping применяется к валютным числам. Используются или thousands_sep или mon_thousands_sep, чтобы отделить группы цифры.

Каждая строка состоит из десятичных чисел, отделяемых точками с запятой. Последовательные числа (слева направо) дают размеры последовательных групп (справа налево, начиная с десятичной точки). Последнее число в строке используется много раз для всех оставшихся групп.

Если последним целым числом является -1, это означает, что любые остающиеся цифры формируются в одну большую группу без разделителей.

Например, при - "4;3;2", правильная группировка для числа 123456787654321 будет " 12 ", " 34 ", " 56 ", " 78 ", " 765 ", " 4321 ". С разделителем ",", число было бы напечатано как " 12,34,56,78,765,4321 ".

Значение "3" указывает повторение группы из трех цифр, как обычно используется в США.

В стандарте " C ", и grouping и mon_grouping имеют значения "". Это значение не определяет никакой группировки вообще.

Это - целые, указывающие, сколько дробных цифр (направо от десятичной точки) должны отобразиться в валютном значении в международных и местных форматах, соответственно. (Наиболее часто, оба элемента имеют то же самое значение.)

В стандарте " C ", оба этих элемента имеют значение CHAR_MAX, означая "неопределенный".

Мы рекомендуем не печатать никаких дробных цифр. (Этот стандарт также определяет пустую строку для mon_decimal_point, так печать любых дробных цифр только путала бы!)

Печать Символа Валюты

Эти элементы структуры struct lconv определяют, как печатать символ, чтобы идентифицировать валютное значение международный аналог " $ ".

Каждая страна имеет два стандартных символа валюты. Местный символ валюты используется обычно внутри страны, в то время как международный символ валюты используется всемирно, чтобы обратиться к валюте этой страны, когда необходимо указать страну недвусмысленно.

Например, многие страны используют доллар в качестве денежной единицы, но для международных валют важно определить, что мы имеем дело с Канадскими долларами, вместо Американских долларов или Австралийских долларов. Но когда контекст известен, не имеется никакой потребности объявлять эти явные долларовые количества в Канадских долларах.

Местный символ валюты для выбранного стандарта.

В стандарте " C ", этот элемент имеет значение "" (пустая строка), означая "неопределенный". Стандарт ANSI не говорит, что делать, когда Вы находите это значение; мы рекомендуем, чтобы Вы просто печатали пустую строку, как Вы печатали бы любую другую строку, найденную в соответствующем элементе.

Международный символ валюты для выбранного стандарта.

Значение int_curr_symbol должно обычно состоять из трех­ символьного сокращения, определенного Международной организацией по стандартизации международного эталона как один из 4217 Кодов для Представления Валюты и Фондов, сопровождаемых разделителем (часто пробел).

В стандарте " C ", этот элемент имеет значение "" (пустая строка), означая "неопределенный". Мы рекомендуем, чтобы Вы просто печатали пустую строку, как Вы печатали бы любую другую строку, найденную в соответствующем элементе.

Эти элементы равны 1, если currency_symbol строка предшествует значению валютного количества, или 0, если строка следует за значением. P_cs_precedes лемент применяется к положительным значениям (или нулю), а n_cs_precedes элемент применяется к отрицательным значениям.

В стандарте " C ", оба этих элемента имеют значение CHAR_MAX, означая "неопределенный". Стандарт ANSI не говорит, что делать, когда Вы находите это значение, но мы рекомендуем печатать символ валюты перед числом. Это - правильно для большинства стран. Другими словами, обработайте все значения отличные от нуля подобно этим элементам.

Стандарт POSIX говорит, что эти два элемента обращаются к int_curr_symbol также как currency_symbol. Стандарт ANSI C, кажется, подразумевает, что они должны применяться только к currency_symbol_so, int_curr_symbol должен всегда предшествовать количеству.

Мы можем только предполагать, которое из этих соответствует обычному соглашению для печати международных символов валюты. Наше предположение - то, что они должны всегда предшествовать количеству. Если мы выясим точный ответ, мы поместим его здесь.

Эти элементы равны 1, если между currency_symbol строкой и количеством ставится пробел, или 0, если никакого пробела не ставится. P_sep_by_space элемент применяется к положительным количествам (или нулю), и n_sep_by_space элемент применяется к отрицательным количествам.

В стандарте "C", оба этих элемента имеют значение CHAR_MAX, означая "неопределенный". Стандарт ANSI не говорит, что Вы должны делать, когда Вы находите это значение; мы предлагаем, чтобы Вы обрабатывали это как 1 (печатайте пробел). Другими словами, обрабатывайте все значения отличные от нуля подобно этому элементу.

Эти элементы применяются только к currency_symbol. Когда Вы используете int_curr_symbol, Вы никогда не печатаете дополнительный пробел, потому что int_curr_symbol непосредственно содержит соответствующий разделитель.

Стандарт POSIX говорит, что эти два элемента обращаются к int_curr_symbol также как currency_symbol. Но пример в стандарте ANSI C ясно подразумевает, что они должны применяться только к currency_symbol_that, int_curr_symbol содержит любой соответствующий разделитель, так что Вы никогда не должны печатать дополнительный пробел.

Мы рекомендуем, чтобы Вы игнорировали эти элементы при печати международных символов валюты и не печатали никаких дополнительных пробелов.

Печать Значения Количества Денег

Эти элементы структуры struct lconv определяют, как печатать знак в валютном значении.

Это - строки, используемые, чтобы указать положительное (или нуль) и отрицательное (соответственно) валютные количества.

В стандарте "C", оба этих элемента имеет значение "" (пустая строка), означая "неопределенный".

Стандарт ANSI не говорит, что делать, когда Вы находите это значение; мы рекомендуем печатать positive_sign. Для отрицательного значения, печатайте negative_sign, если Вы находите его, если оно и positive_sign пусты, тогда печатайте "-" взамен. (Не указывать знак вообще - кажется довольно неблагоразумным.)

Международная Огранизация по Стандартизации (ISO) опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899:2011, ранее известный как C1X. Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Кроме того, определен ряд необязательных для реализации возможностей, включая новый набор безопасных функций (в т. ч. для работы с массивами с проверкой границ). В этот список также попали возможности, которые в предыдущем стандарте считались обязательными: комплексная арифметика, массивы переменной длины.

Некоторые возможности нового стандарта уже поддерживаются компиляторами GCC и Clang. Стоит, однако, отметить, что полной поддержки предыдущего стандарта C99 в этих и большинстве других компиляторов нет.

C (рус. Си) — компилируемый статически типизированный язык программирования общего назначения.

Содержание

История


Кен Томпсон и Деннис Ритчи

Язык программирования С был разработан в лабораториях Bell Labs в период с 1969 по 1973 годы Деннисом Ритчи. Самый активный период творчества пришёлся на 1972 год. Язык назвали «Си» (C — третья буква английского алфавита), потому что многие его особенности берут начало от старого языка «Би» (B — вторая буква английского алфавита).

Язык B был в основном произведением Кена Томпсона при содействии Денниса Ритчи и был опубликован в 1969 году. Язык B можно рассматривать как C без типов. Сам B был создан на основе языка BCPL (Basic Combined Programming Language). Предшественником BCPL был язык CPL, разработанный в начале 1960-х. Название B появилось или от названия BCPL, или от имени жены Томпсона — Бонни. Пример кода на B:

В 1970 Bell Labs приобрела для проекта компьютер PDP-11. Так как B был готов к работе на PDP-11, Томпсон переписал часть UNIX на B.

Но модель B и BCPL подразумевала издержки при работе с указателями: правила языка, определяя указатель как индекс в массиве слов, делали указатели индексами слов. Каждое обращение к указателю при исполнении генерировало масштабирование указателя в адрес байта, который ожидал процессор.


Деннис Ритчи

В 1971 году Ритчи начал создавать расширенную версию B. Сначала он назвал её NB (New B), но когда язык стал сильно отличаться от B, название сменили на C.

Сформировался синтаксис объявления имён, который отражает синтаксис выражения, где эти имена используются. Так

объявляет целое, указатель на целое и указатель на указатель на целое. Синтаксис этих объявлений отражает тот факт, что i, *pi, и **ppi все в результате дают тип int, когда используются в выражении. Похожим образом

объявляют функцию, возвращающую целое, функцию возвращающую указатель на целое, указатель на функцию возвращающую целое;

объявляют массив указателей на целое, указатель на массив целых.

Во всех этих случаях объявление переменной напоминает её использование в выражении, чей тип – это то, что находится в начале объявления.

К 1973 году язык С стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере PDP-11/20, была переписана на С.

В 70-х программистов на C было немного и большинство из них были пользователями UNIX. Тем не менее, в 80-х C вышел за узкие рамки мира UNIX. Компиляторы C стали доступны на различных машинах, работающих под управлением разных операционных систем. В частности, C стал распространяться на быстро развивающейся платформе IBM PC.

В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первую редакцию книги «Язык программирования Си». Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка. Версию языка Си, описанную в ней, часто называют «K&R C».

The C Programming Language preview.jpg

K&R ввёл следующие особенности языка:

  • структуры (тип данных struct);
  • длинное целое (тип данных long int);
  • целое без знака (тип данных unsigned int);
  • оператор += и подобные ему (старые операторы =+ вводили анализатор лексики компилятора C в заблуждение, например, при сравнении выражений i =+ 10 и i = +10).

K&R C часто считают самой главной частью языка, которую должен поддерживать компилятор C. Многие годы даже после выхода ANSI C он считался минимальным уровнем, которого следовало придерживаться программистам, желающим добиться от своих программ максимальной переносимости, потому что не все компиляторы тогда поддерживали ANSI C, а хороший код на K&R C был верен и для ANSI C.

Стандарты

ANSI C (C89)

В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для разработки стандартной спецификации Си. По окончании этого долгого и сложного процесса в 1989 году он был наконец утверждён как «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI C или C89.

Одной из целей этого стандарта была разработка надмножества K&R C, включающего многие особенности языка, созданные позднее. Однако комитет по стандартизации также включил в него и несколько новых возможностей, таких, как прототипы функций (заимствованные из C++) и более сложный препроцессор.

ANSI C сейчас поддерживают почти все существующие компиляторы. Любая программа, написанная только на стандартном С, гарантированно будет правильно выполняться на любой платформе, имеющей соответствующую реализацию С.

В 1990 году, стандарт ANSI C (с небольшими изменениями) был принят Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990. Эту версию иногда называют C90. Однако, термины C89 и C90 относятся в сущности к одному языку.

После стандартизации в ANSI спецификация языка C оставалась относительно неизменной в течение долгого времени, в то время как C++ продолжал развиваться. Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «C99». В марте 2000 года он был принят и адаптирован ANSI.

Некоторые новые особенности C99:

  • подставляемые функции (inline);
  • объявление локальных переменных в любом операторе программного текста (как в C++);
  • новые типы данных, такие, как long long int (для облегчения перехода от 32- к 64-битным числам), явный булевый тип данных _Bool и тип complex для представления комплексных чисел;
  • массивы переменной длины;
  • поддержка ограниченных указателей (restrict);
  • именованная инициализация структур: struct < int x, y, z; >point = ;
  • поддержка однострочных комментариев, начинающихся на //, заимствованных из C++;
  • несколько новых библиотечных функций, таких, как snprintf;
  • несколько новых заголовочных файлов, таких, как stdint.h.

8 декабря 2011 опубликован новый стандарт для языка С (ISO/IEC 9899:2011). Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка Юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Где взять стандарт почитать

Однако можно найти черновые версии в свободном доступе. Например C11.

Популярность

Что написано на C

  • Ядро Linux.
  • Ядро Windows.
  • Интерпретаторы Python, Perl, PHP, bash.
  • Классические UNIX-утилиты.
  • Web-серверы nginx, Apache.
  • СУБД: SQLite, MySQL (

Рейтинги

По индексу TIOBE (количество результатов в поисковиках) язык занимает второе место, хотя его популярность резко падает.

Tiobe.jpg

По рейтингу GitHub (объём изменений в репозиториях) язык занимает 9-е место в 2016 г.

Альтернативы?

  • Современный C++
  • Rust
  • Swift

Компиляторы C

Компиляторов C на самом деле много, но популярных и качественных совсем немного.


infiltr
03.12.12 21:55:32


wota ★★ ( 03.12.12 21:59:41 ) Ответ на: комментарий от wota 03.12.12 21:59:41


То, что надо. Спаибо.

infiltr ( 03.12.12 22:02:27 )


Как-то не нашёл книг/статей по этой теме

Как это можно не найти? В статье про ANSI C на википедии внизу ссылки есть.

DELIRIUM ☆☆☆☆☆ ( 03.12.12 22:23:06 )


Вообще С99 зверек интересный. Вроде как ни один компилятор на 100% его не поддерживает. Да и не исользуется он практически нигде, ну использует его части как расширения и только. По настоящему ходовой базой является с89. Я сам как-то пробовал его нагуглить, но ничего вроде не нашел толком. Но с89 с некоторыми оговорками является подмножеством с++98, так что можешь начать с него.

Dudraug ★★★★★ ( 03.12.12 22:35:53 )


а вообще С11 давно уже вышел

Harald ★★★★★ ( 03.12.12 22:46:16 )


Вот представь ситуацию, в стандарте написано одно , а в компилятор ,которым ты деньги зарабатываешь, делает другое.

ilovewindows ★★★★★ ( 03.12.12 23:02:52 ) Ответ на: комментарий от ilovewindows 03.12.12 23:02:52


плохой, негодный компилятор :)

надо тогда написать багрепорт, чтоб исправили

Harald ★★★★★ ( 03.12.12 23:10:14 ) Ответ на: комментарий от Dudraug 03.12.12 22:35:53


Что же такое есть в c99, что не поддерживает gcc?

Eddy_Em ☆☆☆☆☆ ( 03.12.12 23:13:58 ) Ответ на: комментарий от Dudraug 03.12.12 22:35:53


Вообще С99 зверек интересный. Вроде как ни один компилятор на 100% его не поддерживает.

Сановский поддерживает. Видать, из принципа сделали. GCC поддерживает весьма здоровую долю, без шпаргалки пробелы в поддержке не найдёшь.

const86 ★★★★★ ( 03.12.12 23:25:48 )


Нашел табличку по c99 в gcc.

А это что за шняга?

Ну а это вообще давным-давно работает.

Бью себя по рукам за это, но иногда так хочется.

Остальное либо используется и без -std=gnu99, либо как обыденность уже, либо на фиг не нужно.

C17 - неофициальное название ISO / IEC 9899: 2018 , последнего стандарта для языка программирования C , подготовленного в 2017 году и опубликованного в июне 2018 года. Он заменил C11 (стандарт ISO / IEC 9899: 2011). C17 будет заменен C2x .

Поскольку он находился в разработке в 2017 году и официально опубликован в 2018 году, C17 также обычно называют C18. GCC , например, рассматривает команды -std=c17 и -std=c18 как эквивалентные, а страница C-Standard в вики ISO-9899 ссылается на ISO / IEC 9899: 2018 как C18, только позже отмечая, что стандарт иногда называется C17.

СОДЕРЖАНИЕ

Отличия от C11

В C17 устранены дефекты в C11 без введения новых языковых функций.

__STDC_VERSION__ Макро увеличивается до значения 201710L .

Подробный список изменений по сравнению с предыдущим стандартом см. В Сводке запроса на разъяснение для C11 .

Поддержка компилятора

Список компиляторов, поддерживающих C17:

  • GCC 8.1.0
  • LLVMClang 7.0.0
  • IAR EWARM v8.40.1
  • Microsoft Visual C ++ VS 2019 (16.8)

Смотрите также

  • C ++ 98 , C ++ 03 , C ++ 11 , C ++ 14 , C ++ 17 , C ++ 20 - версии стандарта языка программирования C ++

Рекомендации

Внешние ссылки

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

C11 (ранее C1X ) является неофициальным названием ISO / IEC 9899: 2011 , в прошлом стандарта для языка программирования Си . Он заменил C99 (стандарт ISO / IEC 9899: 1999) и был заменен C17 (стандарт ISO / IEC 9899: 2018). C11 в основном стандартизирует функции, уже поддерживаемые распространенными современными компиляторами, и включает подробную модель памяти для лучшей поддержки нескольких потоков выполнения. Из-за отложенной доступности соответствующих реализаций C99, C11 делает некоторые функции необязательными, чтобы упростить соответствие стандарту основного языка.

Окончательный проект, N1570, был опубликован в апреле 2011 года. Новый стандарт прошел окончательную проверку проекта 10 октября 2011 года и был официально ратифицирован ISO и опубликован как ISO / IEC 9899: 2011 8 декабря 2011 года без каких-либо комментариев, требующих решение участвующих национальных органов.

Стандартный макрос __STDC_VERSION__ определяется со значением, 201112L указывающим, что доступна поддержка C11. Некоторые функции C11 поддерживаются GCC, начиная с версии 4.6, Clang, начиная с версии 3.1, IBM XL C, начиная с версии 12.1, и Microsoft Visual C ++, начиная с VS 2019 (16.8) в сентябре 2020 года.

СОДЕРЖАНИЕ

Отличия от C99

Стандарт включает несколько изменений в спецификации языка и библиотеки C99, например:

  • Спецификация выравнивания ( _Alignas спецификатор, _Alignof оператор, aligned_alloc функция, <stdalign.h> заголовок)
  • Спецификатор _Noreturn функции и <stdnoreturn.h> заголовок
  • Типовые выражения с использованием _Generic ключевого слова. Например, следующий макрос cbrt(x) переводит cbrtl(x) , cbrt(x) или в cbrtf(x) зависимости от типа x :

Дополнительные особенности

Новая редакция позволяет реализациям не поддерживать определенные части стандарта, в том числе те, которые были обязательными для поддержки в редакции 1999 года. Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.

Критика

См. Также: Обработка строк C § Замены

Необязательные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено их исключить или удалить из следующей версии стандарта. Даже Microsoft, главный сторонник этого интерфейса, не соответствует этому определению. Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintf и open_memstream . Несколько реализаций с открытым исходным кодом включают библиотеку «Safer C» Open Watcom C / C ++ и safeclib.

Содержание

История

После процесса стандартизации 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
  • Проектируемые инициализаторы
  • Составные константы
  • Поддержка вариативных макросов (макросов переменной арности)
  • Смягчение ( restrict ) ограничений для более агрессивной оптимизации кода

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

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

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

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

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

Согласно Sun Microsystems, Sun Studio (которое доступно для свободного скачивания) уже полностью поддерживает стандарт C99. [2]

Интерпретатор языка Си Ch поддерживает основные особенности C99 [3] и свободно доступен в версиях для Windows, Linux, Mac OS X, Solaris, QNX и FreeBSD.

Определение версии

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

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

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

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

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

Читайте также: