LINUX.ORG.RU

Опубликован новый стандарт языка C: C11

 , ,


0

8

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

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

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

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

Последний черновик стандарта

>>> Подробности

★★★

Проверено: Shaman007 ()

Внезапно и неожиданно! Лично я на фоне нового стандарта C++ даже и забыл, что C тоже потихоньку пилят...

mironov_ivan ★★★★★ ()

> # анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);

Хехе, это же было в план9 в их компайлерах давным-давно...

anonymous ()
Ответ на: комментарий от anonymous

Но кому, кроме отпетых маргиналов, это интересно?

anonymous ()

улучшенная поддержка юникода;

Объясните нубу, что это значит. Появились специальные функции? теперь можно не писать конструкции вида if( byte < 0xC0 ) blablabla..?

fractaler ★★★★★ ()

Интересно как выглядит поддержка много поточности, boost.thread запилили что ли?

anonymous ()

После С99 - С11, логичненько

soko1 ★★★★★ ()

Лямбды где? Где лямбды, я вас спрашиваю!

CARS ★★★★ ()
Ответ на: комментарий от CARS

зачем они тебе в сишке? для этого есть плюсы же

anonymous ()

C11

С99
С11
А какие компиляторы эти стандарты поддерживают?

sjb ()
Ответ на: комментарий от fractaler

С википедии:

Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004 (char16_t and char32_t types for storing UTF-16/UTF-32 encoded data, including conversion functions in <uchar.h> and the corresponding u and U string literal prefixes, as well as the u8 prefix for UTF-8 encoded literals

theNamelessOne ★★★★★ ()
Ответ на: комментарий от anonymous

зачем они тебе в сишке? для этого есть плюсы же

зачем нужны лямбды в плюсах, если сами плюсы не нужны совсем?

gensym ★★ ()

Как ни странно, практически все основные изменения - торт.

P.S. вот этот тред и одна страница слабо укладываются в голове.
Хотя все с чего-то начиналось...

elrprt ()

«Обобщенные макросы» - это неточно: на самом деле, это новый синтаксис выражений:

_Generic(arg,
  type1: expr1,
  type2: expr2,
  default: expr3
)
Выбирает выражение в зависимости от типа агрумента.

unsigned ★★★ ()

Too little too late.

Но за ссылку на последний драфт - спасибо.

tailgunner ★★★★★ ()
Ответ на: комментарий от theNamelessOne

С++-капец?

С таким набором изменений - нет, те же обобщенные макросы просто кривой костыль, по сравнению с ним С++ просто образец прямоты.

anonymous ()

Отличная новость. 90% времени провожу в писании программ на Си, рад что его всё-таки пилят)

Grid_Sergey ()

Я видел этот тред на одной странице... Красота. Будем учить.

enchantner ()
Ответ на: комментарий от anonymous

Вспоминая шаблоны, нужно забывать про «образец прямоты».

unsigned ★★★ ()

обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);

Они упоролись.

Begemoth ★★★★★ ()
Ответ на: комментарий от unsigned

Вспоминая шаблоны, нужно забывать про «образец прямоты».

До тез пор, пока на глаза не попадет то, что предлагается в С11.

anonymous ()
Ответ на: комментарий от unsigned

Вспоминая шаблоны, нужно забывать про «образец прямоты».

По сравнению с этими обощёнными выражениями шаблоны таки образец прямоты. В С99 они добавили _Complex, теперь _Generic, С++ в этом плане гораздо красивее.

Begemoth ★★★★★ ()

Многопоточность

Немного копипаста.

thread_local /* keyword */
void call_once(once_flag *flag, void (*func)(void));
int cnd_broadcast(cnd_t *cond);
void cnd_destroy(cnd_t *cond);
int cnd_init(cnd_t *cond);
int cnd_signal(cnd_t *cond);
int cnd_timedwait(cnd_t *restrict cond,
      mtx_t *restrict mtx,
      const struct timespec *restrict ts);
int cnd_wait(cnd_t *cond, mtx_t *mtx);
void mtx_destroy(mtx_t *mtx);
int mtx_init(mtx_t *mtx, int type);
int mtx_lock(mtx_t *mtx);
int mtx_timedlock(mtx_t *restrict mtx,
     const struct timespec *restrict ts);
int mtx_trylock(mtx_t *mtx);
int mtx_unlock(mtx_t *mtx);
int thrd_create(thrd_t *thr, thrd_start_t func,
     void *arg);
thrd_t thrd_current(void);
int thrd_detach(thrd_t thr);
int thrd_equal(thrd_t thr0, thrd_t thr1);
_Noreturn void thrd_exit(int res);
int thrd_join(thrd_t thr, int *res);
int thrd_sleep(const struct timespec *duration,
     struct timespec *remaining);
void thrd_yield(void);
int tss_create(tss_t *key, tss_dtor_t dtor);
void tss_delete(tss_t key);
void *tss_get(tss_t key);
int tss_set(tss_t key, void *val);
pthread-капец, в общем.

unsigned ★★★ ()

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

Почему?

P.S. ну ладно, я видел этот тред с одной страницей.

MrClon ★★★★★ ()
Ответ на: комментарий от Begemoth
_Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local

Мне тоже не нравится, в общем-то. Но, например, для _Noreturn добавлен макрос noreturn.

unsigned ★★★ ()
Ответ на: комментарий от anonymous

Но кому, кроме отпетых маргиналов, это интересно?

Разработчикам Linux Kernel?

MrClon ★★★★★ ()
Ответ на: Многопоточность от unsigned

Re: Многопоточность

pthread-капец, в общем.

как только будет рабочая реализация в gcc и clang

anonymous ()

где про атомарные типы? Это одна из основных фич нового стандарта.

anonymous ()
Ответ на: комментарий от CARS

CARS

Лямбды где? Где лямбды, я вас спрашиваю!

В С++ те же лямбды реализованы функторами. Вопрос: как ты подобные вещи сделаешь в С, где нету ничего далее указателя на функцию? создавать lambda_t с несовместимостью со стандартными средствами С?

Pavval ★★★★★ ()
Ответ на: комментарий от tailgunner

tailgunner

Но за ссылку на последний драфт - спасибо.

Скоро нормальный вариант где-то выложат.

Pavval ★★★★★ ()
Ответ на: комментарий от tailgunner

Думаю, нет. Это я наперед загадываю.

И, кажется, с pthreads тут работы на день.

unsigned ★★★ ()
Ответ на: Многопоточность от unsigned

unsigned

pthread-капец, в общем.

Всегда лучше иметь платформенно-независимый API.

Pavval ★★★★★ ()

Зашибись :) Жалко не скоро будет повсеместно использоваться...

adzeitor ()
Ответ на: комментарий от unsigned

Мне тоже не нравится, в общем-то

Я не о том, выравнивание, многопоточность (модель исполнения, а не набор функций) должны быть в С, как в переносимом ассемблере, а _Complex и тем более _Generic указывают на общую слабость системы типов и выглядят инородно в С.

Begemoth ★★★★★ ()
Ответ на: комментарий от anonymous

где про атомарные типы? Это одна из основных фич нового стандарта.

Многопоточность подразумавает их как один из API синхронизации.

Pavval ★★★★★ ()
Ответ на: комментарий от anonymous

где про атомарные типы?

В многопоточности, вестимо.

Begemoth ★★★★★ ()
Ответ на: комментарий от tailgunner

tailgunner

Но это же будет незаконно :)

Я тебе лично разрешаю.

Pavval ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.