Недавно я изучил C11, и многие новые функции облегчают мне кодирование на C. Мне интересно, что ВСЕ эти функции официально поддерживаются С++ 11. Меня беспокоят не проблемы с реализацией или компилятором, а новый стандарт C++.
Поддерживает ли C++11 новые функции C11?
Ответы (3)
Нет, C++11 не поддерживает ВСЕ функции C11. Он даже не поддерживает все функции C99. Массивы переменной длины, например, были введены в C99, но C++ еще не поддерживает их. Подробнее см. этот вопрос.
int foo[n]
с непостоянным n
. О каких различиях я должен знать? Я вижу, что он больше не предназначен для С++ 14.
- person zneak; 04.09.2014
sizeof
или decltype
. В C99 sizeof является операцией времени выполнения при использовании на VLA. Я слышал, что есть и другие отличия, которые я не могу вспомнить навскидку.
- person Ben Voigt; 04.09.2014
Среди основных дополнений два являются общими для C11 и C++11: потоки и атомарность. Я также думаю, что новая модель упорядочивания памяти является общей для них двоих, но я недостаточно хорошо знаю С++ 11, чтобы утверждать это с уверенностью.
Одно важное дополнение к C11, вероятно, никогда не будет использоваться в C++: ввод обобщенных выражений с помощью _Generic
. Для многих случаев использования этого, в частности для перегрузки функций, уже существуют конструкции C++, которые это реализуют. Другие более сложные варианты использования, такие как обнаружение целочисленных постоянных выражений времени компиляции, не охватываются C++. В С++ 1 есть constexpr
, но, кроме названия, можно предположить, что это не инструмент для определения того, является ли выражение константным выражением, а для указания, что объект или возвращаемая функция являются константами. Создание совершенно разных кодов для двух случаев (постоянного и непостоянного) не представляется возможным.
Мало того, что _Generic
не требуется для основных вариантов использования в C++, он также сильно зависит от программирования макросов на этапе предварительной обработки. Поскольку макросы не одобряются значительной частью сообщества С++, добавление этого, безусловно, не найдет консенсуса.
constexpr
.
- person TemplateRex; 02.10.2013
Стандарт C++11 ссылается на стандарт C99, особенно на стандартную библиотеку C.
C++11 поддерживает некоторые, но не все функции, которые есть в C99, но не в C90. (Некоторые функции C99 либо по-разному поддерживаются в C++, либо не считаются подходящими.)
C11 добавил ряд функций поверх C99; большинство этих новых функций не также были добавлены в C++.
Одним заметным исключением является поддержка потоков (<threads.h>
в C11, <thread>
в C++11). Я не смотрел на это достаточно близко, чтобы понять, насколько они похожи.
(C11 также сделал некоторые из своих новых функций, а также некоторые функции C99, необязательными; это также не отражено в C++.)
gets()
.
- person Crowman; 06.09.2013