C++ 1MIT осень 1 2021

Материал из CSC Wiki
Перейти к:навигация, поиск

Общее

На курсе используется C++17 или C17 в зависимости от ситуации. Нестандартные расширения, как правило, запрещены.

Честность в домашках

Весь код должен быть написан исключительно вами самостоятельно. Запрещается привлекать кого угодно для помощи с домашками, кроме лектора, практиков и проверяющих. Репетиторов тоже нельзя — лучше попросить дополнительную пару, это норм.

Запрещается публиковать или передавать за пределы вашего курса (или более старших курсов нашей программы) и условия, и решения задач. Если вам хочется что-то указать в резюме — вы можете кратко описать задание и свои успехи текстом. Пожалуйста, уважайте труд преподавателей: на разработку первой версии одного домашнего задания легко может уйти полная рабочая неделя в сорок часов, после чего задание каждый год улучшается в деталях.

Нарушения караются. Как минимум у всех участников (включая давшего списать, даже если случайно) полностью зануляется соответствующее задание. Сверх этого — по ситуации.

Можно и нужно обсуждать друг с другом и преподавателем:

  • Содержимое лекций
  • Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает vector::push_back в каких случаях?"
  • Настройку среды разработки, запуск компиляторов
  • Вопросы на StackOverflow
  • Чисто алгоритмическую часть заданий, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"

Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:

  • Вопросы по условию
  • Подсказки

Нельзя обсуждать ни с кем, кроме лектора, практиков или проверяющих:

  • Проблемы в своём конкретном коде
  • Детали реализации алгоритмов, вроде "как лучше назвать эту переменную" или "какой инвариант тут лучше сделать"

Софт

Общее

Список

Независимо от ОС и среды разработки обязательно требуется работать с консолью, можете посмотреть вводную лекцию или часть курса на Stepik (от раздела 1.4 "Terminal: основы" до раздела 1.6 "Ввод / вывод" включительно): ОС много, сред разработки много, настроек много, а консоль очень похожа.

Рекомендуется ставить всё сразу на английском языке. Вся актуальная документация и форумы в основном только на английском. Преподаватели в основном работают с англоязычным софтом.

Рекомендуется ставить 64-битные версии.

Независимо от ОС потребуется поставить следующее, способ установки зависит от ОС. Всё это вместе даже без виртуальной машины легко займёт десяток гигабайт.

  1. Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные.
  2. Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут).
  3. Систему сборки CMake. Если используете не Visual Studio — то ещё и систему сборки Make.
  4. Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса.
    • Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на @edu.hse.ru.
    • Другая самая мощная IDE — Visual Studio. Только под Windows, только вместе с компилятором Visual C++.
    • Популярные редакторы: Visual Studio Code (кроссплатформенный, не путать с Visual Studio), Sublime Text (платный), vim (сложный). У каждого свои приколы.
  5. Инструменты от проекта LLVM: clang-format, clang-tidy.
  6. Статический анализатор cppcheck.
  7. Библиотека Boost.
    • Обычно заголовки (включая нужные нам библиотеки Asio и DLL) ставятся все одновременно.
    • Также требуется поставить как минимум библиотеки Filesystem и System (но при возможности лучше поставить просто всё сразу).
  8. Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе.
  9. Если вы хотите, можете бесплатно поставить 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
    • Например, на Windows стоит хотя бы CMake 3.21, чтобы можно было указать CMAKE_TOOLCHAIN_FILE не в командной строке, а через переменную среды
  • 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
    • При тестировании под Visual Studio используется Boost 1.75.0
  • Только под 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 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС.

Отладка проблем

Если gcc/clang/clang-tidy не может найти стандартные заголовки — запустите их с ключом -v, чтобы посмотреть, какие используются пути. Проверьте версию. Например, если вы поставили себе gcc-11 без g++-11, то clang может начать искать заголовки C++ у gcc 11, но их там нет.

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 make  # CMake и Make
# 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, скомпилированный для работы с libstdc++

Также поставьте стандартную библиотеку 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

  1. В качестве компилятора вы можете поставить на выбор:
    • 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++.
  2. Консольный клиент git ставится с официального сайта. В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это.
  3. CMake ставится с официального сайта
    • make для GCC/Clang из msys2 ставится при помощи pacman -S make (генератор называется "MSYS Makefiles").
  4. В качестве среды разработки рекомендуется либо CLion, либо Visual Studio.
  5. Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать:
  6. Cppcheck 1.90 по ссылкам с официального сайта
  7. Boost ставится в зависимости от компилятора:
    • Если у вас стоит msys2 — pacman -S mingw-w64-x86_64-boost (может установиться более новая версия, чем надо) — версия для использования с libstdc++
    • Если у вас стоит Visual Studio, то у вас есть два способа:
      • Ручная установка (если вы собираетесь использовать консоль или CMake):
        1. Установите отсюда (это 64-битная версия 1.71.0 для MSVC v142, это ABI, начиная с Visual Studio 2019)
        2. Если делаете проект 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
        3. Если используете CMake — добавьте ему при первом запуске аргументы -DBOOST_ROOT=путь-до-папки-boost_1_71_0.
        4. В переменную среды PATH добавьте полный путь до папки boost_1_71_0\lib64-msvc-14.2 (в ней лежит куча DLL-файлов). Альтернатива — добавить в CMake параметр -DBoost_USE_STATIC_LIBS=ON
      • Установка через NuGet (если вы собираетесь использовать только графический интерфейс):
        1. Для каждого проекта нажмите References > Manage NuGet Dependencies > вкладка Browse.
        2. Найдите нужную для установки библиотеку. Вы можете поставить либо только определённые библиотеки для линковки (вроде boost_filesystem-vc142), либо все сразу (boost-vc142), либо только заголовки (boost, включено как зависимости у предыдущих опций).
        3. Выберите версию 1.71.0 и нажмите Install.
        4. Дождитесь надписи ========== Finished ========== в выводе Package Manager, это может занять несколько минут даже на быстром интернете при установке только одной библиотеки.
        5. Добавленные библиотеки перечислены в новом файле packages.json в проекте.
  8. В качестве виртуальной машины установите 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.

Осторожно: не пишите main в PowerShell

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 make cppcheck # Установка gcc, clang и инструментов LLVM, git, cmake, make, 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++11, C++03 — это совсем другой язык. Следующие огромные изменения ожидаются в C++20.

Дополнительные материалы

C++20 и метапрограммирование

Практика 1: Суворов

Проверка 1: Анюшева

Анюшева Елена Батыровна

Telegram: @elena-anyusheva

Практика 2: Головчанская

Головчанская Юлия Игоревна
gol.ju@yandex.ru
Telegram: @golju

Презентации

Доклады

Проверка 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

Материалы практики: тык