В чем смысл стандарта C99? - PullRequest
14 голосов
/ 22 ноября 2010

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

Это печально, учитывая, что стандарт был написан и доработан более 10 лет назад. Кроме того, время от времени я слышу обсуждения C1x, и мне интересно, почему кто-то будет предпринимать шаги по пересмотру языка, учитывая, что текущая версия языка еще не реализована.

Итак, мой вопрос, как сегодня программисту C Joe Blow, что полезно для w.r.t. стандарт C99 для меня (если есть)?

Ответы [ 6 ]

14 голосов
/ 22 ноября 2010

C99 предоставляет функции, которые действительно делают программирование на C проще и безопаснее от ошибок:

  • назначенные инициализаторы
  • составные литералы
  • for переменные области видимости
  • целочисленные типы фиксированной ширины

Язык также намного более выразителен с

  • макросами variadic
  • inline функциями

На моей машине с Linux у меня есть четыре компилятора, которые в достаточной степени поддерживают C99, что позволяет использовать его ежедневно: gcc , clang , opencc и icc .

Первые два - это компиляторы с открытым исходным кодом, в которых clang пытается быть совместимым с gcc (то есть поддержка C99 примерно одинакова).

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

9 голосов
/ 22 ноября 2010

MSVC не поддерживает и не будет поддерживать C99.Но у Microsoft мало стимулов для обновления своего компилятора Си.Не то чтобы они потеряли много бизнеса из-за этого.

Но есть много компиляторов, которые поддерживают C99.

http://en.wikipedia.org/wiki/C99#Implementations

Относительно gcc:

http://gcc.gnu.org/c99status.html

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

7 голосов
/ 22 ноября 2010

Что касается C1x, я думаю, что стоит отметить, что комитет по стандартам хорошо знает, что C99 не получил широкого распространения и не хочет повторять те же ошибки (или усугублять ситуацию). Из Устава C1x :

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

И

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

4 голосов
/ 22 ноября 2010

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

И да, если вы знаете, что ваша библиотека будет использоваться людьми, которые используют MSVC, вы не можете использовать функции C99 в интерфейсах, но нет никаких причин не использовать C99 в реализации (кроме функции библиотеки зависимости конечно).

Оригинальный ответ: «А? Какие компиляторы не поддерживают C99? Кроме того, когда вы переходите от компиляторов к инструментам, C99 на самом деле чаще поддерживается, чем C89».

2 голосов
/ 22 ноября 2010

Если вам небезразлична производительность, тут нет пути restrict.

1 голос
/ 22 ноября 2010

FreeBSD теперь использует Clang для компиляции ядра, и это в значительной степени поддерживает C99.

...