Оригинал статьи на форониксе, ниже — вольный перевод.
На прошедшем в минувшие выходные FOSDEM в аудитории, посвящённой BSD, David Chisnall дал оценку поддержки стандартов C11 и C++11 во FreeBSD. Большая часть работ над поддержкой последних стандартов ведётся разработчиками компиляторов, а проект FreeBSD ищёт удачное применение улучшениям и новым возможностям.
Для тех, кто не следит за стандартами ISO, сделаем краткий обзор новых возможностей C11 (некоторые расширения сделаны опциональными из-за плохой поддержки C99 в компиляторе Microsoft):
- static assert
- стандартизированная поддержка многопоточности (_Thread_local и _Atomic, <threads.h> и <stdatomic.h>)
- стандартизированная поддержка юникода (<uchar.h>)
- выравнивание данных (спецификатор _Alignas, оператор alignof, функция aligned_alloc и <stdalign.h>)
- косметические улучшения, такие как типизация в макросах с помощью _Generic
В свою очередь C++11 предоставляет:
- static assert
- стандартизированные умные указатели
- потоки, атомарные переменные и TLS (хранилище переменных, видимых только в пределах потока).
- улучшенную поддержку локалей
- множество косметических и иных изменений
В данный момент проект FreeBSD поставляет GCC версии 4.2.1 (последняя версия, не перелицензированная под GPLv3) и объявил об отказе от него в будущем, поэтому статус поддержки C++11 в GCC в данном случае не имеет значения. LLVM/Clang, используемый во FreeBSD как системный компилятор, уже начал реализацию обоих стандартов (см. таблицу состояния C++11 в различных компиляторах). Clang в целом заменил GCC, оставшиеся доработки будут сделаны достаточно скоро. В качестве стандартной библиотеки используется libc++ (и libcxxrt), которая также является частью LLVM. Кроме того, есть некоторые специфичные для FreeBSD вещи
Файл sys/cdefs.h абстрагирует прежние расширения GNU, теперь ставшие частью C11. Также он:
- воспроизводит имена C11, но не заменяет имена, если они предоставленны компилятором
- может быть использован прямо сейчас для любого диалекта C/C++
- используется остальными заголовочными файлами FreeBSD
Многопоточность в C11/C++11:
- стандартный API управления потоками реализован для C++, но не для C
- атомарные операции готовы (и в компиляторе, и в стандартной библиотеке)
- TLS реализовано для C через ключевое слово __thread, в C++ проблемой остаются типы с нетривиальными конструктором/деструктором
- _Noreturn готов
- сохранение исключений в переменные (с возможностью передачи в другой поток) — готово, часть стандартной библиотеки.
Также к незавершённым вещам можно отнести поддержку юникода (<uchar.h> для C и <uchar> для C++) и даже некоторые функции <math.h> из C99. К завершённым — улучшения локалей из C++11 и POSIX 2008.
>>> Подробности