Я недавно исследовал C11, и многие новые функции облегчают мне код на C. Мне интересно, ВСЕ эти функции официально поддерживаются C ++ 11. Меня беспокоит не проблема реализации или компилятора, а новый стандарт C ++.
Нет, C ++ 11 не поддерживает ВСЕ функции C11. Он даже не поддерживает все функции C99. Например, массивы переменной длины были введены в C99, но C ++ пока не поддерживает их. Увидеть этот вопрос для деталей.
Среди основных дополнений два поделены между C11 и C ++ 11: потоки и атомарность. Я думаю, что новая модель секвенирования памяти также используется совместно, но я недостаточно хорошо знаю C ++ 11, чтобы с уверенностью утверждать это.
C ++, вероятно, никогда не поделится одним важным дополнением к C11: типовые выражения с _Generic
, Для многих случаев использования этого, в частности перегрузки функций, уже есть конструкции C ++, которые реализуют это. Другие более сложные случаи использования, такие как обнаружение целочисленных константных выражений времени компиляции, не охватываются C ++. C ++ 1 имеет constexpr
, но кроме имени может указывать, что это не инструмент для определения того, является ли выражение константным выражением, а для указания того, что возвращаемый объект или функция является константой. Генерация совершенно разных кодов для двух случаев (постоянного и непостоянного) не представляется возможной.
Не только это _Generic
не требуется для основных случаев использования в C ++, он также сильно зависит от макропрограммирования на этапе предварительной обработки. Поскольку макросы осуждаются большими частями сообщества C ++, добавление, которое определенно не найдет консенсуса.
Стандарт C ++ 11 ссылается на стандарт C99, особенно для стандартной библиотеки C.
C ++ 11 поддерживает некоторые, но не все функции, которые есть в C99, но не в C90. (Некоторые специфичные для C99 функции либо по-разному поддерживаются в C ++, либо не считаются подходящими.)
C11 добавил ряд функций поверх C99; большинство из этих новых функций были не также добавлен в C ++.
Одним заметным исключением является поддержка потоков (<threads.h>
в С11, <thread>
в C ++ 11). Я не посмотрел на это достаточно внимательно, чтобы понять, насколько они похожи.
(C11 также сделал некоторые из своих новых функций, а также некоторые функции C99, необязательный; это также не отражено в C ++.)