C++ 1MIT весна 1 2021
Содержание
Общее
Организация курса на GitHub: https://github.com/hse-spb-2020-cpp
Софт
- Основной компилятор: gcc со стандартной библиотекой libstdc++ под Linux. С добавлением Address Sanitizer, Memory Sanitizer, UB Sanitizer, Valgrind.
- Также должно собираться clang со стандартной библиотекой libc++ под Linux.
- Также должно собираться Visual Studio на Windows. Если у вас нет — используйте автопроверки. Если возникают проблемы — попросите помочь преподавателя с Windows (например, Егор).
На Windows можно использовать Visual Studio, но в любом случае требуется поставить GCC/Clang. Для этого можно либо поставить WSL 1 + Ubuntu (и внутри будет обычная линуксовая консоль), либо msys2] с пакетом mingw-w64-x86_64-gcc
(это будет gcc, который компилирует под Windows). Егор использует оба варианта, чтобы показывать поведение и под Windows, и под Linux.
Установка clang и stdc++ на Ubuntu
- До Ubuntu 20.04: добавляем в конец
/etc/apt/sources.list
две строчки, соответствующие вашей версии Ubuntu (смотри/etc/lsb-release
). Например, для Ubuntu 16.04.1 LTS:
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main
sudo apt update
sudo apt install clang-10 libc++-10-dev libc++abi-10-dev
Можно установить на Ubuntu 18.04 после этих шагов.
Потом можно компилировать при помощи команды clang++-10 -stdlib=libc++ main.cpp -o main
. Почти все флаги как у GCC, включая warnings.
Обработка ошибок автопроверок в Visual Studio
По умолчанию Visual Studio компилируется в отладочном режиме с кучей проверок (примерно как _GLIBCXX_DEBUG
), но при падении assert
вылезает окно с кнопками. Автопроверки про это не знают, окно не закрывают, зависают и просто падают по таймауту. Чтобы этого не было, добавьте примерно такой код в ваш main.cpp
:
#ifdef _MSC_VER
#include <crtdbg.h>
#endif
int main() {
#ifdef _MSC_VER
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
#endif
}
Вызовы _CrtSetReportMode
заменят окно на обычный вывод в std::cerr
и сообщение в отладчик (при его наличии). Строчки с #ifdef
обязательны, чтобы соответствующий код включался только при компиляции под Visual Studio.
Лекции
Лектор: Суворов Егор Федорович (egor_suvorov@mail.ru]), в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Также есть Telegram: yeputons
Базовые материалы
Материалы с лекций: https://github.com/hse-spb-2020-cpp/lectures
- Специализация "Искусство разработки на современном C++" на Coursera. Ближе всего идеологически, особенно в начале — начинается не с Си, а сразу с современного C++.
- Про зарезервированные имена в Си и C++ (нижние подчёркивания и не только): stackoverflow.com/a/228797/767632
- Детальный справочник по C++. Содержит сильно больше, чем надо в курсе. Лучше искать и читать понятные подмножества по конкретным темам вроде
std::sort
или member functions).
Просто хорошие учебники
Тут может быть другое изложение, другие примеры, не хватать большого количества деталей. Но базовая картинка должна сложиться такая же: язык один и тот же, стараемся использовать только общепринятые термины и явно подчёркивать отсебятину.
- Книга "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: Алфёров
Василий Алфёров.
Почта: vasily.v.alferov@gmail.com
Телега: vasiliyalferov
GitHub: vasalf
Материалы: https://github.com/hse-spb-2020-cpp/practice-alferov
Практика 2: Соснин
Антон Соснин.
Почта: antsosnin@yandex.ru
Телега: @antonso- предпочтительно
GitHub: mrfeod
Материалы: https://github.com/hse-spb-2020-cpp/practice-sosnin
Практика 3: Суворов
Егор Суворов.
Почта: egor_suvorov@mail.ru, в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Telegram: yeputons
GitHub: yeputons
Материалы: https://github.com/hse-spb-2020-cpp/practice-suvorov
Проверяющий: Краско
Евгений Краско.
Почта: krasko.evgeniy@gmail.com, в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Telegram: kraskoes
GitHub: krasko
Правила приема лаб:
- Исправлять можно любой балл, кроме нуля.
- За отлично сделанное со второй попытки задание всё равно можно получить полный балл.
- Гарантируется одна попытка на исправления после первого ревью; дальше - по ситуации (скорее всего, вторую попытку буду давать только в редких случаях).
- Если есть вопросы по замечаниям - отвечайте на гитхабе; если я после этого не отвечаю вам 24 часа - можно написать в телеграм.
Дедлайны (все - в указанные даты в 23:59):
- lab06. 23 февраля для проблем с Files Changed; 26 февраля для замечаний по коду.
- lab07. После 1-го раунда проверки: 22 марта.
- lab08. После 1-го раунда проверки: 17 апреля.
- lab09. На исправление: 15 мая.
- lab10. Одна итерация исправлений: до 4 июня.
Проверяющий: Гулецкий
Артур Гулецкий.
Почта: hatless.fox@gmail.com, в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
GitHub: HatlessFox