Поддерживает ли C++11 новые функции C11?

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


person flee    schedule 05.09.2013    source источник
comment
Некоторые, но это два разных языка.   -  person chris    schedule 06.09.2013
comment
Какие особенности, конкретно? Некоторые новые функции C также являются функциями C++ (но без гарантий, поскольку @chris говорит, что это независимые языки).   -  person Greg Hewgill    schedule 06.09.2013
comment
Я знаком с C++11, но не с C11: было бы полезно знать, что вы конкретно ищете. Кроме того, есть некоторые области, в которых два языка используют разные подходы, и функции не будут отображаться из C в C++.   -  person Dietmar Kühl    schedule 06.09.2013
comment
что именно вы подразумеваете под многими новыми функциями?   -  person lpapp    schedule 06.09.2013
comment
По крайней мере, массивы переменной длины C99 сейчас не поддерживаются C++.   -  person Yu Hao    schedule 06.09.2013


Ответы (3)


Нет, C++11 не поддерживает ВСЕ функции C11. Он даже не поддерживает все функции C99. Массивы переменной длины, например, были введены в C99, но C++ еще не поддерживает их. Подробнее см. этот вопрос.

person verbose    schedule 05.09.2013
comment
Массивы переменной длины запланированы для С++ 14 (просто для того, чтобы указать временные рамки для вашего заявления). - person zneak; 11.09.2013
comment
@zneak: Нет, массивы времени выполнения, рассматриваемые для C++, отличаются от VLA C. - person Ben Voigt; 04.09.2014
comment
@BenVoigt, N3820 включает пример формы int foo[n] с непостоянным n. О каких различиях я должен знать? Я вижу, что он больше не предназначен для С++ 14. - person zneak; 04.09.2014
comment
@zneak: массивы предложений, привязанных к среде выполнения, в C++ не допускаются в качестве аргументов для sizeof или decltype. В C99 sizeof является операцией времени выполнения при использовании на VLA. Я слышал, что есть и другие отличия, которые я не могу вспомнить навскидку. - person Ben Voigt; 04.09.2014

Среди основных дополнений два являются общими для C11 и C++11: потоки и атомарность. Я также думаю, что новая модель упорядочивания памяти является общей для них двоих, но я недостаточно хорошо знаю С++ 11, чтобы утверждать это с уверенностью.

Одно важное дополнение к C11, вероятно, никогда не будет использоваться в C++: ввод обобщенных выражений с помощью _Generic. Для многих случаев использования этого, в частности для перегрузки функций, уже существуют конструкции C++, которые это реализуют. Другие более сложные варианты использования, такие как обнаружение целочисленных постоянных выражений времени компиляции, не охватываются C++. В С++ 1 есть constexpr, но, кроме названия, можно предположить, что это не инструмент для определения того, является ли выражение константным выражением, а для указания, что объект или возвращаемая функция являются константами. Создание совершенно разных кодов для двух случаев (постоянного и непостоянного) не представляется возможным.

Мало того, что _Generic не требуется для основных вариантов использования в C++, он также сильно зависит от программирования макросов на этапе предварительной обработки. Поскольку макросы не одобряются значительной частью сообщества С++, добавление этого, безусловно, не найдет консенсуса.

person Jens Gustedt    schedule 06.09.2013
comment
проголосовали против C++11 может обнаруживать константные выражения времени компиляции с помощью constexpr. - person TemplateRex; 02.10.2013
comment
@TemplateRex, я посмотрю на это, как это можно сравнить с функцией C. Проголосовать за такую ​​вещь, не дав мне времени на исправление, кажется немного экстремальным. Вы случайно не тот, кто преследует меня в последний день и отрицает несколько старых ответов, которые я дал много лет назад? - person Jens Gustedt; 02.10.2013
comment
нет, я стараюсь всегда оставлять комментарий и обычно проверяю, есть ли обновления по ответу, чтобы я мог отозвать любые отрицательные голоса. Что касается других отрицательных голосов, я думаю, что несколько человек в чате C++ вчера вечером были расстроены вашим редактированием тега в этом вопросе, где два ответа, получившие наибольшее количество голосов (включая один из моих), также были одновременно проголосованы против (без комментариев). - person TemplateRex; 02.10.2013
comment
@TemplateRex, хорошо, спасибо за уведомление. Дело в том, что меня тоже немного огорчило, что этот вопрос был взят насильно C++-сообществом. - person Jens Gustedt; 02.10.2013
comment
Ничего не произошло по принуждению, а скорее по стечению обстоятельств: вопрос был опубликован в Lounge, в то время там не было тегов (по крайней мере, не по ОП), а затем один парень опубликовал ответ метапрограммирования C ++, затем C Затем последовала версия constexpr ++ 11, а затем я опубликовал ответ constexpr C ++ 14. Все с намерением помочь как ОП, так и будущим читателям. Только потом выяснилось, что ОП программировал на C, и сегодня он откатил правки. Это его право, но я думаю, что вопрос также полезен для пользователей C ++, поэтому голосование против него без комментариев также немного экстремально. - person TemplateRex; 02.10.2013
comment
о, и, кстати, не существует такого понятия, как сообщество C++. Как говорит Страуструп: никто не знает, чем занимается большинство программистов на C++. На самом деле существует даже Boost.Preprocessor, которая чаще всего используется хардкорными метапрограммистами шаблонов для выполнения своей работы. Это не идеологическая война, а просто поиск нужных инструментов. - 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++.)

person Keith Thompson    schedule 06.09.2013
comment
Насколько я понимаю, в C11 добавлена ​​поддержка многопоточности, как в виде языковой поддержки, так и компонентов, используемых для работы с потоками и примитивами синхронизации. Я думаю, что все эти функции относятся к C++, хотя спецификации C и C++ не обязательно идентичны. - person Dietmar Kühl; 06.09.2013
comment
Также было множество других мелочей, таких как анонимные структуры, отсутствие функций возврата, некоторые обобщенные выражения типов и тому подобное. И, самое главное, наконец-то избавился от gets(). - person Crowman; 06.09.2013
comment
C11 добавил поддержку потоков С++ 11 (и атомарность) больше, чем наоборот;) - person J.N.; 06.09.2013