C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
Что такое С ++?
C ++ - это (в основном) статически типизированный, произвольный, (обычно) скомпилированный, мультипарадигмальный, промежуточный -уровневый язык программирования общего назначения; не путать с cили c++-cli. Он был разработан в начале 1980-х годов Бьярном Страуструпом, первоначально как набор расширений языка программирования C. Основываясь на C, C ++улучшил безопасность типови добавлена поддержка автоматического управления ресурсами, объектной ориентации, общего программирования и обработки исключений, среди других функций.
Новичок в C ++?
Если вы новичок в программировании или переходите на C ++ с другого языка программирования, настоятельно рекомендуется иметь хорошую книгу для изучения языка. Мы храним подробный список книг.
Если вы ищете хорошие компиляторы, GCCявляется наиболее часто используемым компилятором в Linux и других Unix-подобных платформах; Clang- официальный компилятор для Mac и FreeBSD; Microsoft Visual C ++ является наиболее часто используемым компилятором в Windows. компилятор Intel® C ++также широко используется для оптимизированные численные вычисления для Windows, Linux и Mac.
Turbo-C ++ 3.0 с 1991 года крайне устарел и определенно не рекомендуется. Смотрите предыдущий абзац для свободного выбора из этого тысячелетия.
Присоединяйтесь к нам в чате, где мы обсуждаем C ++, программирование в целом и даже другие вещи, когда солнце садится и скука Подкрадывается. Не забывайте свое чувство юмора, но держите его цивилизованным.
c++Использование тегов
При публикации вопросов о программировании на C ++ обязательно указывайте:
- Информация о целевой системе и компиляторе. Это включает имя компилятора, версию и параметры, используемые для компиляции.
- Если ваш вопрос относится к одной конкретной версии языка, добавьте c++98c++03c++11c++14c++17, c++20или c++23. Вопросы о повышении следует добавить тег boost. Подробности о различных версиях можно найти ниже в этой вики.
- Если в вопросе явно не указано, какая версия стандарта C ++ используется, предполагается, что используется текущая версия. То есть, в зависимости от версии ISO 14882, которая в настоящее время указана как активная. Помните об этом, когда отвечаете или комментируете вопросы с тегом c++.
Совместное использование cи c++
C и C ++ - это два разных и часто несовместимых языка. Избегайте использования обоих тегов в одном и том же вопросе, если у вас нет веских причин.
Вопрос должен быть помечен только c, если:
- Он содержит чистый C, без следов C ++ или вопросы с кодом, который может быть любым языком.
- Код компилируется с помощью компилятора Си.
Вопрос должен быть помечен только c++, если:
- Он содержит код с любыми функциями C ++. Хотя код может быть "стиль C".
- Код компилируется с помощью компилятора C ++.
Вопрос должен быть помечен как cи c++, если речь идет о:
- Конкретные различия между C и C ++.
- Совместимость или перенос кода между C и C ++.
- Код C ++, использующий библиотеки C (например, код с использованием
extern "C"
).
Правила редактирования и модерации для сообщений с тегами cи c++:
Чтобы редактировать / повторно помечать / модерировать вопросы с обоими тегами, рекомендуется, чтобы у вас были полные права редактирования и либо золотой c, либо золотой C ++значок .
Если вы столкнулись с сообщением с обоими тегами, отредактируйте / повторно пометите его, если необходимо, в соответствии с вышеуказанными правилами. Если вы можете сказать язык, прочитав опубликованный код, просто отредактируйте теги соответствующим образом. Избегайте подсказок пользователю "это C или C ++?" в комментариях, если вопрос действительно неясен.
Один пример неясного вопроса - когда пользователь явно заявляет, что он программирует на C, но публикует сообщения кода или компилятора для C ++. Если это так, запросите разъяснения и проведите закрытое голосование как неясное.
«С или С ++ - это хорошо», мнения ОП - явный признак плохого или неясного вопроса. Ответы могут быть очень разными в зависимости от выбранного языка. Запрашивать разъяснения, закрыть как неясные / слишком широкие, пока ФП не разъяснит это.
Будьте осторожны с повторной пометкой вопросов, когда будут опубликованы ответы, особенно если уже есть ответы на C и C ++. В таких случаях теги должны быть оставлены в покое, поскольку их изменение сделает опубликованные ответы недействительными.
Ответы с кодом C ++ на вопрос C, который никогда не был помечен как c++, следует удалить как не по теме. Пожалуйста, проверьте историю редактирования вопроса, прежде чем отмечать / удалять такие ответы, чтобы убедиться, что у вопроса никогда не было тега C ++.
c++98
В 1998 году комитет по стандартам C ++ опубликовал первый международный стандарт для C ++ ISO / IEC 14882: 1998. , который был бы неофициально известен как C ++ 98.
c++03
В 2003 году Комитет C ++ отреагировал на многочисленные проблемы, о которых было сообщено с помощью c++98, и внес соответствующие изменения. Измененный язык получил название C ++ 03.
c++11
Языковой стандарт долгое время оставался практически неизменным, но в 2011 году в ISO/IEC 14882: 2011. Вместо того, чтобы подход «большого взрыва», он постепенно внедряется, так как компиляторы поддерживают новые языковые функции. См. часто задаваемые вопросы Бьярна Страуструпа по C ++ 11, чтобы узнать, что нового в языке, и проверить FAQ своего собственного компилятора. чтобы увидеть, какие из этих функций в настоящее время поддерживаются:
- поддержка языка GCCи поддержка библиотеки libstdc++
- Поддержка языка Clangи поддержка библиотеки libc++
- Поддержка языка и библиотек Microsoft Visual C ++
- Поддержка языков Intel
Несколько функций, которые обсуждались для C ++ 11, были перенесены на следующую итерацию.
c++14
C ++ 14 - это небольшое расширение C ++ 11. Он был утвержден в августе 2014 года и выпущен в декабре того же года. Ранее назывался C ++ 1y, поскольку год утверждения был неопределенным. Многие популярные компиляторы уже имеют некоторый уровень поддержки C ++ 14.
- Поддержка языка GCC C ++ 14
- Поддержка языка Clang C ++ 14
- Поддержка языка Intel C ++ 14
- Поддержка языка Microsoft Visual C ++ C ++ 14
c++1z
C ++ 17 добавляет еще несколько основных функций (и несколько второстепенных). Обычно его называют C ++ 1z или C ++ 17, поскольку техническая работа над новым стандартом была завершена в марте 2017 года. Проект стандарта был утвержден (единогласно) ISOв сентябре 2017 года и официально опубликованныев декабре 2017 года.
- Поддержка языка GCC C ++ 17
- Поддержка языка Microsoft Visual C ++ C ++ 17
- Поддержка языка Clang C ++ 17
- Поддержка языка Intel C ++ 17
C ++ 20
В феврале 2020 года комитет по стандарту C ++ завершил работу над C ++ 20. Позднее в том же году он был единогласно одобрен и официально опубликован в декабре 2020 года.
Следующие (и более) новые функции уже приняты в C ++ 20:
трехстороннее сравнениес использованием оператора new (космический корабль)
<=>
назначенные инициализаторы(на основе функции C99 с некоторыми ограничениями)
универсальные лямбды(списки параметров шаблона в лямбда-выражениях)
оператор инициализации в цикле
for
на основе диапазонаобновление библиотеки хронографа: новые часы, гражданский календарь, часовые пояса, форматирование в строкуи синтаксический анализ
понятия - требуются выражения, ограничения шаблона, библиотека концепций
улучшение параллелизма и добавление сопрограмм
Поддержка языка GCC C ++ 20добавить параметр командной строки
-std=c++20
(используйте-std=c++2a
в GCC 9 и ранее)Поддержка языка Clang C ++ 20добавьте параметр командной строки
-std=c++20
(используйте-std=c++2a
в Clang 9 и ранее)
c++23
Следующие (и другие) новые функции уже включены в черновик C ++ 23:
Предложение по признаку типа для обнаружения перечислений с ограниченным объемом
Clang C ++ 23 поддержка языкадобавить параметр командной строки
-std=c++2b
начиная с Clang 12
Онлайн-компиляторы
Если вы хотите попробовать C ++, попробуйте один из следующих онлайн-сервисов компилятора:
- Coliru(GCC, Clang)
- ideone.com(GCC, Clang)
- codepad(GCC)
- rextester(GCC, Clang, Visual C ++)
- repl.it(GCC)
- ELLCC(Clang)
- CodingGround(GCC)
- Оболочка C ++(GCC)
- Wandbox(GCC, Clang)
- Compiler Explorer(GCC, Clang, ICC, Visual C ++). Многие версии GCC / Clang для x86, а также для некоторых архитектур, отличных от x86 (ARM, ARM64, PPC и AVR), а также последние версии Microsoft Visual C ++. Помимо выполнения (кнопка ./a.out), он включает красиво отформатированный вывод на ассемблере, даже при необходимости выделяя цветом исходные строки и строки ассемблера, чтобы помочь найти, какая строка исходного кода соответствует какой строке ассемблера.
- C ++ Insights(Clang) Транс-компилятор кода, который показывает код C ++ 98, который отображается на современные конструкции
- Quick Bench(GCC, Clang) Микро-инструмент для сравнительного анализа, предназначенный для быстрого и простого сравнения производительности фрагментов кода.
FAQ по стеку в C ++
- Как мне перебрать слова строки?
- Обычное приведение против static_cast против dynamic_cast
- Что означает явное ключевое слово?
- Что такое правило трех?
- Каковы различия между переменной-указателем и ссылочной переменной в C ++?
- Что такое идиома копирования и обмена?
- Есть ли в скобках после имени типа разница с новым?
- Почему программисты на C ++ должны минимизировать использование «нового»?
- Полное руководство и список книг C ++
- Где я могу найти текущие стандартные документы C или C ++?
- Неопределенное, неопределенное и определяемое реализацией поведение
- Насколько неопределенным является неопределенное поведение?
- Что такое неопределенная ссылка / неразрешенная внешняя ошибка символа и как ее исправить?
- Окончательный список распространенных причин ошибок сегментации
- Почему std :: getline () пропускает ввод после форматированного извлечения?
- Почему iostream :: eof внутри условия цикла (то есть `while (! Stream.eof ())`) считается неправильным?
- Почему "using namespace std;" считается плохой практикой?
Внешние часто задаваемые вопросы
- ISOCPP унифицированный современный C ++ FAQ
- FAQ по C ++: ранее C ++ FAQ Lite
- FAQ по шаблонам C ++
- Bjarne Stroustrup: часто задаваемые вопросы по стилю и технике C ++
- Часто задаваемые вопросы Бьярна Страуструпа по C ++ 11
Другие внешние ресурсы
cplusplus: справочная информация, учебные пособия и история
Гуру недели: серия статей о высококачественном, безопасном для исключений коде C ++
Ресурсы по оптимизации для x86, включая встроенные функции C ++ для векторных инструкций: x86