C++ 1MIT осень 1 2021
Содержание
- 1 Общее
- 2 Софт
- 3 Лекции
- 4 Практика 1: Суворов
- 5 Проверка 1: Анюшева
- 6 Практика 2: Головчанская
- 7 Проверка 2: Рухлов
- 8 Проверка 2: Самойлов
- 9 Практика 3: Кравченко
- 10 Проверка 3: Андрей
- 11 Практика 4: Соснин
- 12 Проверка 4: Краско
- 13 Практика 5: Данковский
- 14 Проверка 5: Гулецкий
- 15 Практика 6: Алфёров
Общее
На курсе используется C++17 или C17 в зависимости от ситуации. Нестандартные расширения, как правило, запрещены.
Честность в домашках
Весь код должен быть написан исключительно вами самостоятельно. Запрещается привлекать кого угодно для помощи с домашками, кроме лектора, практиков и проверяющих. Репетиторов тоже нельзя — лучше попросить дополнительную пару, это норм.
Запрещается публиковать или передавать за пределы вашего курса (или более старших курсов нашей программы) и условия, и решения задач. Если вам хочется что-то указать в резюме — вы можете кратко описать задание и свои успехи текстом. Пожалуйста, уважайте труд преподавателей: на разработку первой версии одного домашнего задания легко может уйти полная рабочая неделя в сорок часов, после чего задание каждый год улучшается в деталях.
Нарушения караются. Как минимум у всех участников (включая давшего списать, даже если случайно) полностью зануляется соответствующее задание. Сверх этого — по ситуации.
Можно и нужно обсуждать друг с другом и преподавателем:
- Содержимое лекций
- Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает
vector::push_back
в каких случаях?" - Настройку среды разработки, запуск компиляторов
- Вопросы на StackOverflow
- Чисто алгоритмическую часть заданий, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"
Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:
- Вопросы по условию
- Подсказки
Нельзя обсуждать ни с кем, кроме лектора, практиков или проверяющих:
- Проблемы в своём конкретном коде
- Детали реализации алгоритмов, вроде "как лучше назвать эту переменную" или "какой инвариант тут лучше сделать"
Софт
Общее
Список
Независимо от ОС и среды разработки обязательно требуется работать с консолью, можете посмотреть вводную лекцию или часть курса на Stepik (от раздела 1.4 "Terminal: основы" до раздела 1.6 "Ввод / вывод" включительно): ОС много, сред разработки много, настроек много, а консоль очень похожа.
Рекомендуется ставить всё сразу на английском языке. Вся актуальная документация и форумы в основном только на английском. Преподаватели в основном работают с англоязычным софтом.
Рекомендуется ставить 64-битные версии.
Независимо от ОС потребуется поставить следующее, способ установки зависит от ОС. Всё это вместе даже без виртуальной машины легко займёт десяток гигабайт.
- Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные.
- Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут).
- Систему сборки CMake.
- Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса.
- Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на
@edu.hse.ru
. - Другая самая мощная IDE — Visual Studio. Только под Windows, только вместе с компилятором Visual C++.
- Популярные редакторы: Visual Studio Code (кроссплатформенный, не путать с Visual Studio), Sublime Text (платный), vim (сложный). У каждого свои приколы.
- Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на
- Инструменты от проекта LLVM: clang-format, clang-tidy.
- Статический анализатор cppcheck.
- Библиотека Boost.
- Обычно заголовки (включая нужные нам библиотеки Asio и DLL) ставятся все одновременно.
- Также требуется поставить как минимум библиотеки Filesystem и System (но при возможности лучше поставить просто всё сразу).
- Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе.
- Если вы хотите, можете бесплатно поставить Windows 10 в виртуальной машине с официального сайта внутрь VirtualBox. Она живёт месяц-другой и дальше её надо скачать заново и переустановить.
Версии в тестирующей системе
Мы ориентируемся на последние стабильные 64-битные версии софта, доступные в стандартных репозиториях Ubuntu 20.04 и Windows 10.
Запуск команды с ключом --version
должен выводить:
- GCC 10 (
g++
):g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
- Clang 12 (
clang++
):Ubuntu clang version 12.0.0-3ubuntu1~20.04.3
- CMake 3.15 или более новый (
cmake
):cmake version 3.16.3
- clang-format 12 (
clang-format
):Ubuntu clang-format version 12.0.0-3ubuntu1~20.04.3
- clang-tidy 12.0.0 (
clang-tidy
):LLVM version 12.0.0
- Cppcheck 1.90 (
cppcheck
):Cppcheck 1.90
- Boost 1.71.0 в файле
boost/version.hpp
должен определятьBOOST_VERSION
, равный107100
- Только под Linux: Valgrind 3.15.0 или около того (
valgrind
):valgrind-3.15.0
- Только под Windows: Visual Studio Community 2019 v16.11.2 (версия компилятора Visual C++ 19.29.30133)
Если версия не сошлась или команда отсутствует — попробуйте добавить в конце команды номер версии через дефис, например: clang++-12
.
Особенно важны точные версии для clang-format, clang-tidy, cppcheck. У остальных инструментов поведение между минорными версиями сильно не меняется.
Следующая программа в скомпилированном виде выводит версию компилятора и стандартной библиотеки:
#include <iostream> int main() { std::cout << "C++ " << __cplusplus << "\n"; #if defined(__x86_64__) || defined(_WIN64) std::cout << "64-bit\n"; #else std::cout << "32-bit\n"; #endif std::cout << "Detecting compiler...\n"; #if defined(__GNUC__) && !defined(__clang__) std::cout << "GNU C " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__ << "\n"; #endif #ifdef __clang__ std::cout << "LLVM clang " << __clang_version__ << "\n"; #endif #ifdef _MSC_VER std::cout << "Microsoft Visual C++ " << _MSC_VER << "\n"; #endif std::cout << "Detecting standard library...\n"; #ifdef __GLIBCXX__ std::cout << "GNU libstdc++: " << __GLIBCXX__ << "\n"; #endif #ifdef _LIBCPP_VERSION std::cout << "LLVM libc++: " << _LIBCPP_VERSION << "\n"; #endif #ifdef _MSVC_STL_VERSION std::cout << "Microsoft STL: " << _MSVC_STL_VERSION << " at " << _MSVC_STL_UPDATE << "\n"; #endif }
Всегда должно выводиться C++ 201703
и 64 bit
. Дальше:
- Для GCC:
GNU C 10.3.0
иGNU libstdc++ 20210408
- Для Clang:
LLVM clang 12.0.0
иGNU libstdc++ 20210408
- Для Clang с ключом
-stdlib=libc++
:LLVM clang 12.0.0
иLLVM libc++ 12000
- Для Visual Studio:
C++ 199711
даже при включённом C++17 (потому что нужна совместимость со старым кодом, но это можно настроить, нам не потребуется),Microsoft Visual C++ 1929
иMicrosoft STL 142 at 202104
Проверка установки
Проверьте версии софта по списку выше. Также убедитесь, что консольный клиент git у вас версии хотя бы 2.25
Если вы ставили виртуальную машину с Ubuntu 20.04 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС.
Linux
Ubuntu
Проверьте, что у вас действительно Ubuntu 20.04: команда cat /etc/lsb-release
должна вывести Ubuntu 20.04.3 LTS
, цифра 3 может быть поменьше.
Обновите всю систему до последней версии: sudo apt update && sudo apt upgrade
. Теперь версия должны быть Ubuntu 20.04.3 LTS
.
Дальше установите нужные пакеты:
sudo apt install g++-10 clang-12 # Компиляторы sudo apt install git # Консольный клиент для git; bash уже стоит sudo apt install cmake # CMake # CLion можно поставить [https://www.jetbrains.com/ru-ru/clion/ с официального сайта] sudo apt install clang-format-12 clang-tidy-12 # Инструменты от LLVM sudo apt install cppcheck # Cppcheck sudo apt install libboost-all-dev # Boost
Также поставьте стандартную библиотеку libc++:
sudo apt install libc++-12-dev libc++abi-12-dev
При работе из консоли всегда команды с суффиксом версии: g++-10
, clang++-12
, clang-format-12
, clang-tidy-12
. Пакеты и команды без суффикса, вроде g++
, могут относиться к старым версиям.
В частности, вам нужно корректно настроить вашу среду разработки (SDKs в CLion) и консольный CMake (при помощи параметра вроде -DCMAKE_CXX_COMPILER=g++-10
).
В качестве виртуальной машины для Windows рекомендуется поставить VirtualBox: sudo apt install virtualbox
.
Другие дистрибутивы Linux
Вы можете либо поставить виртуальную машину с Ubuntu, либо сделать Docker-контейнер на основе образа Ubuntu 20.04.
Для установки Windows без вариантов: только виртуальная машина, рекомендуется VirtualBox.
Windows
- В качестве компилятора вы можете поставить на выбор:
- GCC/Clang. Есть несколько сборок, рекомендуется msys2: установите msys2, после чего из консоли msys запустите команду
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make
. Для Clang поставьтеpacman -S mingw-w64-x86_64-clang
, для libc++ поставьтеpacman -S mingw-w64-x86_64-libc++
. - Visual Studio Community 2019 с Workload ("Рабочая нагрузка") "Desktop development with C++" ("Разработка классических приложений на C++"). В ней достаточно компонентов "MSVC v142 ... x86/64" ("MSVC версии 142 ... x86/64"), "Windows 10 SDK" ("Пакет SDK для Windows 10 ") и "C++ Address Sanitizer", но вы можете также добавить "C++ profiling tools" ("Средства профилирования C++", может помочь при поиске тормозов в программе), "IntelliCode". Также обязательно поставьте английский язык, а вот русский лучше удалить.
- Если поставили Visual Studio, то можно поставить ещё и Clang к нему по ссылкам с официального сайта, он будет использовать стандартную библиотеку от Visual Studio. Но тогда не получится компилировать с
libc++
.
- GCC/Clang. Есть несколько сборок, рекомендуется msys2: установите msys2, после чего из консоли msys запустите команду
- Консольный клиент git ставится с официального сайта. В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это.
- CMake ставится с официального сайта
- В качестве среды разработки рекомендуется либо CLion, либо Visual Studio.
- Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать:
- Если у вас стоит msys2 —
pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-clang-tools-extra
- Если у вас стоит Visual Studio — по ссылкам с официального сайта
- Если у вас стоит msys2 —
- Cppcheck 1.90 по ссылкам с официального сайта
- Boost ставится в зависимости от компилятора:
- Если у вас стоит msys2 —
pacman -S mingw-w64-x86_64-boost
(может установиться более новая версия, чем надо) - Если у вас стоит Visual Studio, то у вас есть два способа:
- Ручная установка (если вы собираетесь использовать консоль или CMake):
- Установите отсюда (это 64-битная версия 1.71.0 для MSVC v142)
- Если делаете проект Visual Studio самостоятельно, добавьте в ему настройки:
- Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки
boost_1_71_0
- Configuration Properties > Linker > Additional Library Directories — полный путь до папки
boost_1_71_0\lib64-msvc-14.2
- Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки
- Если используете CMake — добавьте ему при первом запуске аргументы
-DBOOST_ROOT=путь-до-папки-boost_1_71_0
. - В переменную среды
PATH
добавьте полный путь до папкиboost_1_71_0\lib64-msvc-14.2
(в ней лежит кучаDLL
-файлов). Альтернатива — добавить в CMake параметр-DBoost_USE_STATIC_LIBS=ON
- Установка через NuGet (если вы собираетесь использовать только графический интерфейс):
- Для каждого проекта нажмите References > Manage NuGet Dependencies > вкладка Browse.
- Найдите нужную для установки библиотеку. Вы можете поставить либо только определённые библиотеки для линковки (вроде
boost_filesystem-vc142
), либо все сразу (boost-vc142
), либо только заголовки (boost
, включено как зависимости у предыдущих опций). - Выберите версию
1.71.0
и нажмите Install. - Дождитесь надписи
========== Finished ==========
в выводеPackage Manager
, это может занять несколько минут даже на быстром интернете при установке только одной библиотеки. - Добавленные библиотеки перечислены в новом файле
packages.json
в проекте.
- Ручная установка (если вы собираетесь использовать консоль или CMake):
- Если у вас стоит msys2 —
- В качестве виртуальной машины установите Windows Subsystem for Linux (вам достаточно шагов 1-3 "ручная установка") с Ubuntu 20.04, чтобы можно было запускать Valgrind:
wsl --install -d Ubuntu-20.04
. Потом внутри Ubuntu 20.04 поставьте софт по инструкции выше.
Добавьте все инструменты в переменную среды PATH. Например, для msys2 наверняка будет нужна папка вроде C:\msys239\mingw64\bin\
— именно в ней лежит g++.exe
(проверьте!). После этого перезапустите консоль/CLion, чтобы они прочитали новую версию PATH.
Компилятор Clang будет поставлен вместе с инструментам для LLVM и должен начать автоматически использовать соответствующую стандартную библиотеку: GNU libstdc++, если вы ставили через msys2 (можно доставить LLVM libc++), и Microsoft STL, если вы ставили с официального сайта рядом с Visual Studio.
macOS
Будьте осторожны: обычно на macOS используется Apple Clang, который скрывается за командой gcc
и ставится вместе с Xcode. Скорее всего, будет не та версия, что надо. Проверьте, запустив g++ --version
.
При этом библиотеки для C++ (вроде Boost) надо либо собирать из исходников (долго и нудно), либо поставить уже собранные, но тогда они будут работать только с Apple Clang.
Установите пакетный менеджер Homebrew: запустите команду с домашней страницы и внимательно прочитайте, когда оно скажет Run these two commands in your terminal
, эти команды необходимо выполнить.
После чего выполните команды (после #
идёт комментарий):
brew update # Обновление списка доступных пакетов brew install gcc@10 llvm@12 git cmake cppcheck # Установка gcc, clang и инструментов LLVM, git, cmake, cppcheck brew install boost # Установка Boost для Apple Clang. С gcc/llvm clang будет странно не компилироваться и/или странно падать!
Теперь у вас должны появиться команды cmake
и cppcheck
. Если они не появились — у вас не добавлен в переменную PATH
путь до папки с программами, поставленными через Brew. Вам нужно дописать в файл $HOME/.bash_profile
(для Bash) или $HOME/.zprofile
(для Zsh) строчки, которые выводит команда brew shellenv
. После этого переоткройте консоль/CLion, чтобы они увидели изменения.
Чтобы появились команды clang++
, g++
(которые конфликтуют со стандартными командами Xcode) и команды вроде clang-format
(они связаны с первыми), надо добавить в этот же файл в конце строчку export PATH="$(brew --prefix llvm)/bin":$PATH
. После этого переоткройте консоль/CLion, чтобы они увидели изменения.
Будет использоваться стандартная библиотека libc++, не stdlibc++. Из-за этого и говорят, что "на маках компилируется, а под другими ОС нет", виновата другая стандартная библиотека.
Библиотека Boost может оказаться более новой версии, чем требуется.
В качестве виртуальной машины, если у вас процессор Intel, проще всего поставить Oracle VirtualBox и скачать в него готовый образ с Ubuntu 20.04 от проекта OSboxes. Дальше следуйте шагам по настройке Ubuntu 20.04.
Для процессора M1 можно поставить виртуальную машину UTM и Windows for ARM, после чего поставить в неё Visual Studio по инструкции для Windows. Но это будет дико тормозить, так как Visual Studio есть только для x86, а на ARM будет эмуляция.
Сайты
- Pastebin — сюда можно скидывать длинные логи и файлы, всегда ставьте "Paste Exposure: Private"
- Godbolt — исследование различных версий компиляторов
- Wandbox — онлайн-компилятор, поддерживающий некоторые библиотеки и несколько файлов
- Cpp Insights — десахаризатор синтаксиса C++
Лекции
Лектор: Суворов Егор Федорович (egor_suvorov@mail.ru), в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Также есть Telegram: yeputons
Базовые материалы
Материалы с лекций: https://github.com/hse-spb-2021-cpp/lectures
- Специализация "Искусство разработки на современном C++" на Coursera. Ближе всего идеологически, особенно в начале — начинается не с Си, а сразу с современного C++.
- Про зарезервированные имена в Си и C++ (нижние подчёркивания и не только): stackoverflow.com/a/228797/767632
- Детальный справочник по C++ (cppreference). Содержит сильно больше, чем надо в курсе. Лучше искать и читать понятные подмножества по конкретным темам вроде
std::sort
или member functions).- Некоторые темы могут проще описаны на cplusplus.com, но там больше ошибок и неточностей.
Просто хорошие учебники
Тут может быть другое изложение, другие примеры, не хватать большого количества деталей. Но базовая картинка должна сложиться такая же: язык один и тот же, стараемся использовать только общепринятые термины и явно подчёркивать отсебятину.
- Книга "Programming -- Principles and Practice Using C++" (2 издание) за авторством Bjarne Stroustroup (исходный создатель языка C++)
- Видеокурсы по C++ из Computer Science Center: первый семестр, второй семестр
Общее развитие
Обращайте внимание, для какого стандарта вы читаете рекомендации. Минимальный — C++11, C++03 — это совсем другой язык. Следующие огромные изменения ожидаются в C++20.
- ISO C++ Wiki
- C++ Core Guidelines
- GotW (Guru of the Week by Herb Sutter)
- TotW (Tips of the Week by Google)
- Что угодно от Scott Meyers
- Что угодно от Andrei Alexandrescu (скорее доклады, книги выходили до 2010 года)
- P1705R0 Enumerating Core Undefined Behavior — попытка перечислить хоть какие-то UB.
- More C++ Idioms Wikibook
- Серия докладов "Back to Basics" на CppCon: 2019, 2020
Дополнительные материалы
- Серия статей про детали базовых элементов C++ на русском (перегрузки, массивы, операторы...)
- Scott Meyers "Type Deduction and Why You Care" (видеодоклад)
- Получение доступа к приватным типам через друзей и шаблоны (пример кода)
- Klaus Iglberger "Back to Basics: Move Semantics (part 1 of 2)"
- Klaus Iglberger "Back to Basics: Move Semantics (part 2 of 2)"
- Черновик последней версии стандарта C++ (уже после C++20)
- UBBook от Дмитрия Свиридкина (сборник разных граблей)
C++20 и метапрограммирование
- Концепты в C++20
- SFINAE и member detection
- Доклад "Сериализация объектов с блэкджеком и метапрограммированием"
- Библиотека Boost.Hana для метапрограммирования
Практика 1: Суворов
Проверка 1: Анюшева
Анюшева Елена Батыровна
Telegram: @elena-anyusheva
Практика 2: Головчанская
Головчанская Юлия Игоревна
gol.ju@yandex.ru
Telegram: @golju
Презентации
Доклады
- Михаил Матросов — Спецификаторы, квалификаторы и шаблоны
- Михаил Матросов — Как объявить константу в C++?
Проверка 2: Рухлов
Рухлов Никита Николаевич
Telegram: @rukhlov_nn
Проверка 2: Самойлов
Самойлов Виктор Максимович
Telegram: @Atos1337
Практика 3: Кравченко
Кравченко Дима
телега: @equivalence1
Проверка 3: Андрей
Шеин Андрей
Telegram: @andreyshspb
Со мной можно на ТЫ
Практика 4: Соснин
Соснин Антон Алексеевич
antsosnin@yandex.ru
Telegram: @antonso
Проверка 4: Краско
Краско Евгений Сергеевич.
Почта: krasko.evgeniy@gmail.com, в теме письма обязательно укажите [hse] [cpp]
и слово "вопрос", если там вопрос.
Telegram: kraskoes
GitHub: krasko
Правила приема лаб:
- Исправлять можно любой балл, кроме нуля.
- За отлично сделанное со второй попытки задание всё равно можно получить полный балл.
- Гарантируется одна попытка на исправления после первого ревью; дальше - по ситуации (скорее всего, вторую попытку буду давать только в редких случаях).
- Если есть вопросы по замечаниям - отвечайте на гитхабе; если я после этого не отвечаю вам 24 часа - можно написать в телеграм.
Практика 5: Данковский
Данковский Даниил Андреевич alh45011@gmail.com Telegram: @alh45011
Проверка 5: Гулецкий
Артур Гулецкий.
Почта: hatless.fox@gmail.com, в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Практика 6: Алфёров
Алфёров Василий Викторович
Телега: @vasiliyalferov
Почта: teaching@vasalf.net
Материалы практики: тык