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 ()
Последнее исправление: unsigned (всего исправлений: 4)
Ответ на: комментарий от Begemoth

А, ну с этим тоже согласен. Я еще недавно на std::thread ругался - меня не поддержали, сказали, что все ОК.

А _Complex теперь вообще необязательны.

unsigned ★★★★
() автор топика

поддержка многопоточности;

Платформо-независимая многопоточность в языке — это отличная новость.

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

unsigned

А, ну с этим тоже согласен. Я еще недавно на std::thread ругался - меня не поддержали, сказали, что все ОК.

А что именно в std:thread (я, пожалуй, пропустил тему)?

Pavval ★★★★★
()

Интересно, реализуют ли эти фичи для микроконтроллеров, поддерживаемых gcc. Особенно интересно насчёт многопоточности.

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

Платформо-независимая многопоточность в языке — это отличная новость.

+1. Еще бы многопроцессность... То есть API для запуска процессов и для синхронизации (а не только в рамках одного процесса).

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

prischeyadro

Интересно, реализуют ли эти фичи для микроконтроллеров, поддерживаемых gcc. Особенно интересно насчёт многопоточности.

В C++11 многопоточность является опциональной фичей, т.е. может не поддерживаться конкретными реализациями. Тут, думаю, так же.

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

Это я понял. Я хотел бы пример, как мне такую функцию свою написать?
И ещё вопрос, это только для функций одного аргумента?

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

unsigned

Именно то, что это очень системозависимо, и не должно быть в переносимом языке как C++, и тем более в C.

Оно опционально. Я считаю правильным добавлять возможности, что зависят от платформы и будут реализованы в 99% случаев. Для 1% достаточно указать их опциональность. Без тех же тредов придется привязываться к платформе или юзать не самые лучше кроссплатформенные либы.

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

Оно опционально.

Действительно, здесь тоже:

Implementations that define the macro _ _STDC_NO_THREADS_ _ need not provide this header nor support any of its facilities.

Тогда, пожалуй, согласен.

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

Поправка: «опционально» - это:

  • Freestanding implementation - implementation-defined (как раз случай микроконтроллеров и ядер ОС)
  • Hosted implementation - должны поддерживаться.
Pavval ★★★★★
()
Ответ на: комментарий от Bad_ptr

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

Поэтому да, оно для одного аргумента. Для нескольких, наверно, только костылями.

unsigned ★★★★
() автор топика

Ну ладно хоть сюда лямбды не засунули...

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

Это не относится к функциям, это для выражений (которые можно обернуть макросом)

оно в любом случае завязано на препроцессор

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

Но, кстати, еще вопрос, что лучше - привязываться к либам или к компиляторам.

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

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

Я думаю, можно полагаться на то, что компиляторы на одной платформе будут вести себя одинаково

Ага, особенно M$ Visual - клали на C99, положат и на C11.

anonymous
()

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

kranky ★★★★★
()

Еще хоть какую-нибудь поддержку RAII запилили бы, было бы вообще шикарно. Все-таки плюсовый автоматический вызов деструктора при выходе из скоупа — чертовски удобная вещь.

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

Что показать-то? Пример на википедии. Удобное применение - через макрос, я с этим не спорил. А фичу реализует компилятор.

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

Что показать-то?

(медленно) использование type-generic expressions без препроцессора

Пример на википедии.

ага - с макросом

Удобное применение - через макрос, я с этим не спорил.

(медленно) покажи как ты сможешь реализовать «переключение» без препроцессора

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

А где же threads pool и features? Это гавно какое то, а не поддержка мультипоточности.

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

Долго смотрел на слово функтор. Наконец дошло. С++ говно.

boost - говно, а в С++11 лямбды уже добавили в самом ЯП

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

Ясно, мы о разном говорим. Я говорил о реализации, а ты - о применении. Естественно, без макроса оно не нужно (вообще не нужно, я неправильно сказал «неудобно»).

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

Kallikanzarid

Долго смотрел на слово функтор. Наконец дошло. С++ говно.

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

Pavval ★★★★★
()

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

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

> (медленно) использование type-generic expressions без препроцессора

puts(_Generic((char)0, signed char: "char is signed", unsigned char: "char is unsigned"));

;)

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

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

Ну так pthread и задумывался изначально как временная мера до появления поддержки многопоточности в C и С++. Свою задачу выполнил.

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

ты не поверишь, но лишь недавно прошли времена, когда код, успешно компилируемый gcc 2.95, не компилировался gcc 3/4. Про то, как gcc 4.5 сразу после выпуска не мог собрать ведро вашего лялехса под ARM, и приходилось держать несколько тулчейнов, я промолчу. Стабильность во все дыры, ёптыть!

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

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

С чего бы?

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

Именно то, что это очень системозависимо, и не должно быть в переносимом языке как C++, и тем более в C.

Вот тут не соглашусь, в библиотеке переносимого языка такие вещи быть обязаны. Моя претензия к библиотеке С11 - в том, что она определяет ещё один PThread-подобный API (поправьте если я неправ). В C++ же более мощные средства абстракции позволяют сделать более удобный интерфейс, чем у PThread или WinAPI.

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

boost - говно, а в С++11 лямбды уже добавили в самом ЯП

Ага, только вот мономорфные и без вывода типов аргументов, так что в отдельных случаях будет короче и понятнее записать функциональный объект с помощью std::bind.

Begemoth ★★★★★
()

Инкрементирую, уважаемый.

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