Гайд VSCode как C++ IDE

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
В сети крайне мало толковых билдов под C++. В основном хорошие билды только на web-разработку. В результате расширения очень долго собирались в попытках найти что-то полезное в тонне софта на маркетплейсе, а так же из рекомендаций в рандомных источниках, типа LLVM-канала в ДС. При чем что самое странное - некоторые из расширений очень плохо ищутся по тегу C++ на маркетплейсе, при том, что являются популярными (и при этом их так же нет в подборках).

Сначала пройдусь по C++ экстеншенам, а в конце докину всякого на юзабилити.

Языковой сервер​


Microsoft C/C++ - идет нахуй, ну или почти​

Расширение из коробки нормально работает с CMake от того же Microsoft, но оно имеет не очень хороший анализатор кода:
  • медленный
  • очень медленный если надо что-то порефакторить или найти ссылки
  • не всегда показывает результат compile-time выражений
  • часто не правильно разбирает исходники, показывая ошибки там где их нет (особенно часто при кросскомпиляции)
Итого из плюсов у него остается лишь подкидывание авто-сгенерированого дебаг конфига для CMake. Но этот конфиг работает хорошо только для текущей платформы.

Если решили оставлять расширение ради кнопочки дебага с авто-сгенерированым конфигоом, то отключайте Intelli Sense Engine:
JSON:
{
    "C_Cpp.intelliSenseEngine": "Disabled"
}

Настоящий языковой сервер C++​

clangd и C-mantic - вместе дают защеку некоторым большим IDE, типа CLion. При том, что второй даже не надо настраивать

clangd не имеет интеграции с CMake и другими системами сборки, так что для него надо экспортировать compile_commands.json (у CMake это флаг -DCMAKE_EXPORT_COMPILE_COMMANDS=1)

Замечание: clangd и C-mantic оба имеют функцию переключения между исходником и заголовком, но C-mantic делает это лучше, когда файлы находятся в разных папках

VSCode (клиент):
Сервер:
  • ArchLinux AUR (всегда самая актуальная версия)
    • Бинарные версии (лучше собирать самому из AUR):
  • Windows:
    • 19.x (актуальная версия)
    • 18.x

Все версии патченых клиента и сервера: https://nc.sr.team/s/YbgbaJ2DwqPGXJe



Установка:
Для винды распаковываете сервер куда вам удобно, а для ArchLinux он ставится по пути /opt/clangd/bin/clangd
После этого в настройках клиента (расширения) указываете путь к clangd

Если не установить сервер, то из всех фич будут работать только фичи № 14, 15, 16 и 17
Если наоборот не устанавливать клиент, а использовать только патченый сервер с официальным расширением, то не будут работать фичи № 14, 15, 16, 17, а так же у фичи №2 не будет работать открытие ссылок

Фичи патченого clangd:
1. Поддержка doxygen-документации
1706854839283.png

2. CodeLens - добавляет над функциями, классами и типами ссылки на использование/наследования (при клике показывает все ссылки)
Отключить можно добавив в настройках расширения аргумент --code-lens=false
1706854985655.png

3. Postfix completion - добавляет в автодополнение виртуальные операции для генерации свитчей, циклов и кастов
Видео-демка (смотреть обязательно - топ фича от sammcall)

4. inlay hints для паддингов
1706855574112.png

5. Отображение размеров и оффсетов в HEX, когда значение больше 10
1706855664886.png

6.Отображение масок для битовых полей (IDA показывает их через маски)
1706855768883.png

7.Отображение оффсета и размера указателя на функцию в виртуальной таблице
1706855835930.png

8. Отображение имен аргументов в указателях на функции (в обычной версии отображаются только типы)
* В 19.x эта фича принята в основной clangd и может работать без патченой версии
1706856030415.png

9. Отображение суммарного количества всех паддингов в структуре
1706856112285.png

10. Частичная поддержка non-self-contained заголовков
1706856264354.png

11. Подписывание имен аргументов для функций врапперов
1706860280647.png

12. Если есть вызов шаблонного типа, то он диагностируется с первым вариантом вызова (без компиляции)

13. Поддержка hoisting-функций для оборачивания выделенного кода в новую функцию

14. Открытие cppreference.com и boost.org при нажатии Shift+F1, когда курсор находится на функции/типе из STL или буста

15. Интеграция с CMake (можно не экспортировать compile_commands.json для clangd)

16. Из контекстного меню удалены пункты для открытия AST и переключения между хидером и заголовком: первое нахуй не нужно, а второе есть в C-mantic

17. Автоматическая настройка resource dir для clang компиляторов
Clang юзает часть хидеров (например хидеры санитайзеров) из папки рядом с компилятором, и эти хидеры могут отличаться в разных поставках clang

Поиск ошибок​

Отладчик​

Как говорилось выше, можно оставить Microsoft C/C++, но есть так же крутое расширение CodeLLDB
CodeLLDB крут тем, что это очень качественная обертка над lldb - можно задать команды инициализации и даже больше:
  • можно генерировать HTML через брейкпоинты строя графики, или записывая логи;
  • поддерживается reverse-отладка (когда выполнение кода откатывается назад)
  • удаленная отладка (например под android)

Статический анализатор​

clangd уже имеет часть аналитик от clang-static-analyzer и интеграцию с clang-tidy, но там доступны только быстрые проверки
Более медленные проверки, такие как утечки памяти можно запустить через CodeChecker
CodeChecker поддерживает следующие анализаторы:
  • clang-static-analyzer
  • clang-tidy
  • cppcheck
  • gcc-static-analyzer (выключен по умолчанию, и подходит в основном только для C)
Из недостатков CodeChecker требует compile_commands.json, а так же, если используется компилятор clang, то что бы он был первый в PATH (иначе могут быть ложные срабатывания)
1713110106130.png

P.S. clang из дефолтной поставки android-ndk не умеет в CTU (утечки не найдет)

CodeCoverage или просмотр посещенных/не посещенных участков кода при выполнении​

Coverage Gutters выводит информацию из lcov файлов, а сами lcov файлы можно сгенерировать при помощи Lcov Generator (он поддерживает интеграцию с CMake и launch.json)
1713108782681.png
Данный сниппет включает генерацию profraw/gcda файлов, которые содержат информацию о строках кода, посещенных во время выполнения программы

Makefile:
include( CheckCXXCompilerFlag )
include( CheckLinkerFlag )

function( configure_coverage target )
    check_cxx_compiler_flag( "-fprofile-instr-generate -fcoverage-mapping" COMPILER_SUPPORT_LLVM_COVERAGE )
    check_linker_flag( CXX "-fprofile-instr-generate" LINKER_SUPPORT_LLVM_COVERAGE )

    if( COMPILER_SUPPORT_LLVM_COVERAGE AND LINKER_SUPPORT_LLVM_COVERAGE )
        target_compile_options( ${target} PUBLIC -fprofile-instr-generate -fcoverage-mapping )
        target_link_options( ${target} PUBLIC -fprofile-instr-generate )
    else()
        check_cxx_compiler_flag( "-ftest-coverage" COMPILER_SUPPORT_GNU_COVERAGE )
        check_linker_flag( CXX "--coverage" LINKER_SUPPORT_GNU_COVERAGE )

        if( COMPILER_SUPPORT_GNU_COVERAGE AND LINKER_SUPPORT_GNU_COVERAGE )
            target_compile_options( ${target} PUBLIC -fprofile-arcs -ftest-coverage )
            target_link_options( ${target} PUBLIC --coverage )

            if( ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" )
                message( WARNING "Clang generate old format of Gcov and it may be incompatible with you toolchains." )
            endif()
        endif()
    endif()
endfunction()

Использовать примерно так:
Makefile:
add_executable( main main.cpp )

if( main_USE_COVERAGE )
    configure_coverage( main )
endif()
Ну и конфигурировать проект с ключом -D main_USE_COVERAGE=YES

Compiler Explorer или просмотр дизассемблера исходного кода без запуска отладки​

C/C++ Compiler explorer компилирует текущий файл в ASM и включает line-by-line отображение.
Требует что бы в PATH, или по одному пути с компилятором была утилита c++filt. Для подсветки кода нужно ставить отдельное расширение для asm
1713108300046.png
Патченная версия с возможностью задать свои аргументы для генерации asm-кода:

Так же в аргументы можно подкинуть grep через пайп, что бы порезать лишнее и ускорить парсинг (расширение все парсит регексами)

Юзабилити​

Генерация кода​

VS Code C++ class generation tool - создание классов через ПКМ по папке (можно создавать сразу пару и .h и .cpp файлов)

Подсветка кода​

Better C++ Syntax - фикс подсветки C++ кода. Так же может использоваться другими расширениями, такими как следующее
std::format placeholder highlighter - подсветка фигурных скобок для std::format
Color Identifiers - семантическая подсветка (советую в tokenKinds оставить только variable и parameter)
Doxygen Documentation Generator - подсветка doxygen-документации в комментариях, а так же генерация блоков для документации
Error Lens - вывод ошибок слева от строки с кодом, как в QtCreator
Build Output Colorizer - подсветка кода и ошибок, которые выводятся в окно OUTPUT (у CMake будет нормально показывать ошибки компиляции)

Таски​

Tasks - вывод тасков в статусбар (можно выводить не все, выводить группой, а так же задавать иконки и тултипы)
TaskNotify (Fork) - вывод уведомлений о завершении тасков

Поведение VSCode​

Auto Hide (fork) - автоматическое скрытие нижней панели и сайдбаров (можно настроить, что бы все скрывалось по отдельности)
Automatic Editor Sorter - автоматичская сортировка вкладок по алфовиту
cmake-build - дополнение для расширения от Microsoft - выводит уведомления об успешной/неуспешной сборке и открывает вывод CMake в случае ошибок

GIT​

Git Graph - отображение коммитов в виде графа. Оттуда же их можно черипикать и мерджить ветки
GitLess - не жадная версия GitLens (и inlay hints коммиты тут по ощущению быстрее показывает)

AI​

Codeium - просто классный AI-ассистент. Из того, что понравилось - у них своя нейронка для автокомплита, которая работает лучше, чем GH Copilot (сравнивал в июле 2023). В качестве чата классика - ChatGPT
 
Последнее редактирование:

movebx

Известный
47
143
но цлион остается в наших сердцах
Когда эта хуйня спарсит символы быстрее, чем я допишу проект - может быть
Когда эта хуйня не сожрет всю мою оперативку из за двух открытых инстанций - может быть
 
  • Ха-ха
Реакции: why ega и Z3roKwq

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
и все эти анализы полнейшная хуета, потому что под капотом ебучий clangd, который нихуя не умеет, и ломается от любой незакрытой скобки или точки запятой.

Покажите уже людям решарпер в Visual Studio(в CLion Nova он пока не полностью интегрирован)
 

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
и все эти анализы полнейшная хуета, потому что под капотом ебучий clangd, который нихуя не умеет, и ломается от любой незакрытой скобки или точки запятой.

Покажите уже людям решарпер в Visual Studio(в CLion Nova он пока не полностью интегрирован)
Фишка как раз в том, что под капотом НЕ clangd. Недостаток clangd я написал - в нем отключены все медленные анализаторы
 

movebx

Известный
47
143
2. CodeLens - добавляет над функциями, классами и типами ссылки на использование/наследования (при клике показывает все ссылки)
А, собсна, как эту хуету отключить?

Я перерыл весь интернетус и не нашел, как отключить эту поебень.
Типа она не нужна, т.к. есть более адекватная реализация от самого вскода
Плюс при разделении дефайна и имплементации какого то большого и простого класса, у тебя просто засирается ide этими надписями
 

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
А, собсна, как эту хуету отключить?

Я перерыл весь интернетус и не нашел, как отключить эту поебень.
Типа она не нужна, т.к. есть более адекватная реализация от самого вскода
Плюс при разделении дефайна и имплементации какого то большого и простого класса, у тебя просто засирается ide этими надписями
В аргументы clangd: --code-lens=false
 
  • Влюблен
Реакции: movebx

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
Докинул свое расширение, которое автоматически открывает вывод CMake в случае ошибки сборки

Для использования надо перебиндить сборку на команды из этого расширения, а оно уже само дернит оригинальный CMake. По дефолту расширение добавляет бинды:
  • Ctrl+B - сборка
  • F8 - установка
Дополнительно можно забиндить: очистку, конфигурацию, реконфигурацию и открытие вывода CMake (Нижняя панель открывается сразу на CMake/Build, даже если до этого был выбран другой вывод/вкладка)

 
  • Нравится
Реакции: !Sam#0235

sobe1t

Известный
77
1
Дополню насчет генерации compile_commands.json в случае если система сборки из коробки этого не может. Существует прикольная утилита Bear которая позволяет получить базу данных компиляции. Отлично работает в случае легаси проектов с самописными Makefiles. Из больших минусов - на данный момент поддерживается только Linux (можно использовать WSL).
 

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
Обновил патченый clangd:
  • Сервер до ветки 19.x
  • Расширение ребейзнуто на версию 0.1.28 (старая версия была на базе 0.1.25) и добавлена автонастройка resource dir при использовании компилятора clang
 

sobe1t

Известный
77
1
Есть ли какой то способ заставить clangd искать ссылки в заголовочных файлах так же как это делает расширение от майкрософта?
 

sobe1t

Известный
77
1
Есть допустим функция по классике объявленная в .hpp и описанная в .cpp, в VS code я запрашиваю все ссылки на эту функцию (ПКМ Find all references) и clangd почему-то ищет их только в .cpp упорно игноря .hpp такая же фигня и с глобальным ренеймингом. Это какое-то ограничение clangd или ему нужны доп. флаги ? Что-то похожее описывается тут и тут.
 

SR_team

like pancake
Автор темы
BH Team
4,720
6,369
Есть допустим функция по классике объявленная в .hpp и описанная в .cpp, в VS code я запрашиваю все ссылки на эту функцию (ПКМ Find all references) и clangd почему-то ищет их только в .cpp упорно игноря .hpp такая же фигня и с глобальным ренеймингом. Это какое-то ограничение clangd или ему нужны доп. флаги ? Что-то похожее описывается тут и тут.
Понял. Проблема не возникает, когда clangd сам может определить связь между заголовком и сурсом - обычно он с трудом определяет такие связи, если файлы лежат в разных папках, например include/main.hpp и src/main.cpp. Решается включением хидера в compile_commands.json. Где-то в одной из иссушек была тула, которая парсит compile_commands.json и сурсы из него, что бы вытащить все хзидеры и создать из них новый compile_commands.json.

Так же можешь попробовать повторить проблему на патченном клиенте clangd. Я точно не помню, но когда я добавлял поддержку cmake в расширение clangd, CMake вроде как включал хидеры в модель кодаю Но для этого хидеры должны быть указаны в проекте:
Код:
add_library(foo main.cpp main.h) # Хидер указан для компиляции
add_library(bar main.cpp) # Хидер не указан для компиляции
У либы foo - должны норм работать ссылки с патченным clangd клиентом. При этом compile_commands.json для либ foo и bar будут одинаковым - CMake исключает хидеры при его генерации.
 
  • Нравится
Реакции: sobe1t