Описание тега c++
Что такое C++?
C++ - это статически типизированный, универсальный (обычно) скомпилированный, мультипарадигмальный, универсальный язык программирования среднего уровня; не следует путать с C или C++/CLI. Он был разработан в начале 1980-х годов Бьярном Страуструпом, первоначально как набор расширений языка программирования Си. Основываясь на C, C++ улучшил безопасность типов и добавил, среди прочих функций, автоматическое управление ресурсами, объектную ориентацию, общее программирование и обработку исключений.
Новичок в C++?
Если вы новичок в программировании или приехали на C++ с другого языка программирования, настоятельно рекомендуется иметь хорошую книгу для изучения языка. Мы ведем подробный список книг.
Если вы ищете хорошие компиляторы, GCC является наиболее часто используемым компилятором на Linux и других Unix-подобных платформах; Clang - официальный компилятор для Mac и FreeBSD; Microsoft Visual C++ является наиболее часто используемым в Windows. Компилятор Intel также широко используется для его оптимизированных числовых вычислений в Windows, Linux и Mac.
Turbo- C++ 3.0 с 1991 года крайне устарел и определенно не рекомендуется. Смотрите предыдущий абзац для свободного выбора из этого тысячелетия.
Присоединяйтесь к нам в чате, где мы обсуждаем C++, программирование в целом и даже другие вещи, когда солнце садится и нарастает скука. Не забывайте свое чувство юмора, но сохраняйте его цивилизованным.
c++ Использование тегов
При публикации вопросов о программировании C++ обязательно указывайте:
- Информация о целевой системе и компиляторе. Это включает в себя имя компилятора, версию и настройки, используемые для компиляции.
- Если ваш вопрос относится к одной конкретной версии языка, добавьте c++98 c++03 c++11 c++14 c++17 или c++20. Вопросы о повышении следует добавить тег 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++.
C++ 11
Языковой стандарт долгое время оставался практически неизменным, но в 2011 году в стандарте ISO/IEC 14882: 2011 был опубликован новый стандарт C++ 11 (ранее известный как C++ 0x). Вместо того, чтобы подход "большого взрыва", он постепенно разворачивается, так как компиляторы поддерживают новые языковые функции. См. Bjarne Stroustrup C++ 11 FAQ, чтобы узнать, что нового в языке, и посмотрите свой FAQ по компилятору, чтобы узнать, какие из этих функций в настоящее время поддерживаются:
- Поддержка языка GCC и поддержка библиотеки libstd C++
- Поддержка языка Clang и поддержка библиотеки lib C++
- 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++ 17
C++ 17 добавляет еще несколько основных функций (и несколько второстепенных). Обычно его называют C++ 1z или C++ 17, поскольку техническая работа над новым стандартом была завершена в марте 2017 года. Проект стандарта был одобрен (единогласно) ISO в сентябре 2017 года и официально опубликован в декабре 2017.
- GCC C++ 17 языковая поддержка
- Microsoft Visual C++ C++ 17 языковая поддержка
- Поддержка языка Clang C++ 17
C++ 20
Начата работа над изменениями стандарта для C++ 2a или C++ 20 с ожидаемой датой 2020 года выпуска стандарта.
Следующие (и более) новые функции уже были приняты в черновик C++ 20:
- трехстороннее сравнение с использованием оператора new (космический корабль)
<=>
- назначенные инициализаторы (на основе функции C99 с некоторыми ограничениями)
- общие лямбды (списки параметров шаблона в лямбда-выражениях)
- оператор инициализации в пределах цикла
for
основе диапазона - обновление библиотеки хронографа: новые часы, гражданский календарь, часовые пояса, форматирование в строку и анализ
- Пакет расширений в лямбда-init-capture
- контракты
- понятия - требует выражений, шаблонных ограничений, библиотеки понятий
- модули
-
улучшения параллелизма и добавления сопрограмм
Поддержка языка GCC C++ 20 добавить параметр командной строки
-std=C++2a
Поддержка языка Clang C++ 20 добавить параметр командной строки
-std=C++2a
Интернет-компиляторы
Если вы хотите попробовать C++, вы можете попробовать один из следующих онлайн-сервисов компилятора:
- Coliru (GCC, Clang)
- ideone.com (GCC, Clang)
- кодовая панель (GCC)
- ректестер (GCC, Clang, Visual C++)
- repl.it (GCC)
- ELLCC (лязг)
- CodingGround (GCC)
- C++ Shell (GCC)
- Wandbox (GCC, Clang)
- Godbolt 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) Микро-инструмент для сравнительного анализа, предназначенный для быстрого и простого сравнения характеристик фрагментов кода.
Переполнение стека C++ FAQ
- Как перебрать слова строки?
- Обычное приведение против static_cast против dynamic_cast
- Что означает явное ключевое слово?
- Что такое правило трех?
- Каковы различия между переменной указателя и ссылочной переменной в C++?
- Что такое идиома копирования и обмена?
- Есть ли в скобках после имени типа разница с новым?
- Почему программисты C++ должны минимизировать использование "нового"?
- Полное руководство и список C++ книги
- Где я могу найти текущие стандартные документы C или C++?
- Неопределенное, неопределенное и определяемое реализацией поведение
- Насколько неопределенным является неопределенное поведение?
- Что такое неопределенная ссылка/неразрешенная внешняя ошибка символа и как ее исправить?
- Окончательный список распространенных причин ошибок сегментации
- Почему std :: getline() пропускает ввод после форматированного извлечения?
- Почему iostream :: eof внутри условия цикла (то есть 'while (! Stream.eof())') считается неправильным?
- Почему "использование пространства имен std;" считается плохой практикой?
Внешние часто задаваемые вопросы
- ISOCPP унифицированный современный C++ FAQ
- C++ FAQ: ранее C++ FAQ Lite
- C++ FAQ по шаблонам
- Бьярне Страуструп C++ FAQ по стилю и технике
- Бьярне Страуструп C++ 11 FAQ
Другие внешние ресурсы
- Веб-сайт ISO C++
- C++ Ссылка
- Документы комитета по стандартам ISO C++
- C++ Основные руководящие принципы
- cplusplus: справка, учебники и история
- Гуру недели: серия статей о высококачественном, безопасном для исключения коде C++
- Пересмотренный Гуру Недели (для C++ 1y)
- Руководство программиста стандартной библиотеки шаблонов SGI
- Больше C++ идиом
-
Ресурсы по оптимизации для x86, включая встроенные функции C++ для векторных инструкций: ссылки на вики-теги x86
- Руководство по оптимизации Agner Fog для C/C++