- 4,807
- 6,491
В сети крайне мало толковых билдов под C++. В основном хорошие билды только на web-разработку. В результате расширения очень долго собирались в попытках найти что-то полезное в тонне софта на маркетплейсе, а так же из рекомендаций в рандомных источниках, типа LLVM-канала в ДС. При чем что самое странное - некоторые из расширений очень плохо ищутся по тегу C++ на маркетплейсе, при том, что являются популярными (и при этом их так же нет в подборках).
Сначала пройдусь по C++ экстеншенам, а в конце докину всякого на юзабилити.
Если решили оставлять расширение ради кнопочки дебага с авто-сгенерированым конфигоом, то отключайте Intelli Sense Engine:
clangd не имеет интеграции с CMake и другими системами сборки, так что для него надо экспортировать compile_commands.json (у CMake это флаг
Замечание: clangd и C-mantic оба имеют функцию переключения между исходником и заголовком, но C-mantic делает это лучше, когда файлы находятся в разных папках
CodeLLDB крут тем, что это очень качественная обертка над lldb - можно задать команды инициализации и даже больше:
Более медленные проверки, такие как утечки памяти можно запустить через CodeChecker
CodeChecker поддерживает следующие анализаторы:
![1713110106130.png 1713110106130.png](https://www.blast.hk/data/attachments/224/224751-dc32202e11eecff0e51af8b93efb04a2.jpg)
P.S. clang из дефолтной поставки android-ndk не умеет в CTU (утечки не найдет)
![1713108782681.png 1713108782681.png](https://www.blast.hk/data/attachments/224/224749-a3e12971514966da303b80b4a69e0a82.jpg)
Требует что бы в PATH, или по одному пути с компилятором была утилита c++filt. Для подсветки кода нужно ставить отдельное расширение для asm
![1713108300046.png 1713108300046.png](https://www.blast.hk/data/attachments/224/224745-9a4d364db979b9223acbd0ce2f98672c.jpg)
std::format placeholder highlighter - подсветка фигурных скобок для std::format
Color Identifiers - семантическая подсветка (советую в tokenKinds оставить только variable и parameter)
Doxygen Documentation Generator - подсветка doxygen-документации в комментариях, а так же генерация блоков для документации
Error Lens - вывод ошибок слева от строки с кодом, как в QtCreator
Build Output Colorizer - подсветка кода и ошибок, которые выводятся в окно OUTPUT (у CMake будет нормально показывать ошибки компиляции)
TaskNotify (Fork) - вывод уведомлений о завершении тасков
Automatic Editor Sorter - автоматичская сортировка вкладок по алфовиту
cmake-build - дополнение для расширения от Microsoft - выводит уведомления об успешной/неуспешной сборке и открывает вывод CMake в случае ошибок
GitLess - не жадная версия GitLens (и inlay hints коммиты тут по ощущению быстрее показывает)
Сначала пройдусь по C++ экстеншенам, а в конце докину всякого на юзабилити.
Языковой сервер
Microsoft C/C++ - идет нахуй, ну или почти
Расширение из коробки нормально работает с CMake от того же Microsoft, но оно имеет не очень хороший анализатор кода:- медленный
- очень медленный если надо что-то порефакторить или найти ссылки
- не всегда показывает результат compile-time выражений
- часто не правильно разбирает исходники, показывая ошибки там где их нет (особенно часто при кросскомпиляции)
Если решили оставлять расширение ради кнопочки дебага с авто-сгенерированым конфигоом, то отключайте 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 (клиент):
Сервер:
Все версии патченых клиента и сервера: https://nc.sr.team/s/YbgbaJ2DwqPGXJe
Установка:
Для винды распаковываете сервер куда вам удобно, а для ArchLinux он ставится по пути
После этого в настройках клиента (расширения) указываете путь к clangd
Если не установить сервер, то из всех фич будут работать только фичи № 14, 15, 16 и 17
Если наоборот не устанавливать клиент, а использовать только патченый сервер с официальным расширением, то не будут работать фичи № 14, 15, 16, 17, а так же у фичи №2 не будет работать открытие ссылок
Фичи патченого clangd:
1. Поддержка doxygen-документации
![1706854839283.png 1706854839283.png](https://www.blast.hk/data/attachments/218/218229-57e9a7e58d95b9c9d363652973a97daa.jpg)
2. CodeLens - добавляет над функциями, классами и типами ссылки на использование/наследования (при клике показывает все ссылки)
Отключить можно добавив в настройках расширения аргумент
![1706854985655.png 1706854985655.png](https://www.blast.hk/data/attachments/218/218230-d8483fd564033a01c2282d3c5569de23.jpg)
3. Postfix completion - добавляет в автодополнение виртуальные операции для генерации свитчей, циклов и кастов
Видео-демка (смотреть обязательно - топ фича от sammcall)
4. inlay hints для паддингов
![1706855574112.png 1706855574112.png](https://www.blast.hk/data/attachments/218/218231-c909c13a0f0620b369acbaa34dfba03f.jpg)
5. Отображение размеров и оффсетов в HEX, когда значение больше 10
![1706855664886.png 1706855664886.png](https://www.blast.hk/data/attachments/218/218232-73821667cb76c0003bcb73bf47667f0a.jpg)
6.Отображение масок для битовых полей (IDA показывает их через маски)
![1706855768883.png 1706855768883.png](https://www.blast.hk/data/attachments/218/218233-723105ae341209eb01cb087e01fc2593.jpg)
7.Отображение оффсета и размера указателя на функцию в виртуальной таблице
![1706855835930.png 1706855835930.png](https://www.blast.hk/data/attachments/218/218234-5b8b0d31ff1b238a1123a6be3d5f01ca.jpg)
8. Отображение имен аргументов в указателях на функции (в обычной версии отображаются только типы)
* В 19.x эта фича принята в основной clangd и может работать без патченой версии
![1706856030415.png 1706856030415.png](https://www.blast.hk/data/attachments/218/218235-bf596a73f34ec9eaafa13271d4ce7931.jpg)
9. Отображение суммарного количества всех паддингов в структуре
![1706856112285.png 1706856112285.png](https://www.blast.hk/data/attachments/218/218236-ccc89be72cf82ac3b1890b2d87181ce4.jpg)
10. Частичная поддержка non-self-contained заголовков
![1706856264354.png 1706856264354.png](https://www.blast.hk/data/attachments/218/218237-d45eb860e070211d988d5a5051d57865.jpg)
11. Подписывание имен аргументов для функций врапперов
![1706860280647.png 1706860280647.png](https://www.blast.hk/data/attachments/218/218241-ebe5008bd5cdffcb33958cd4de2e2ecc.jpg)
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
Сервер:
- ArchLinux AUR (всегда самая актуальная версия)
- Бинарные версии (лучше собирать самому из AUR):
- Windows:
Все версии патченых клиента и сервера: 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 1706854839283.png](https://www.blast.hk/data/attachments/218/218229-57e9a7e58d95b9c9d363652973a97daa.jpg)
2. CodeLens - добавляет над функциями, классами и типами ссылки на использование/наследования (при клике показывает все ссылки)
Отключить можно добавив в настройках расширения аргумент
--code-lens=false
![1706854985655.png 1706854985655.png](https://www.blast.hk/data/attachments/218/218230-d8483fd564033a01c2282d3c5569de23.jpg)
3. Postfix completion - добавляет в автодополнение виртуальные операции для генерации свитчей, циклов и кастов
Видео-демка (смотреть обязательно - топ фича от sammcall)
4. inlay hints для паддингов
![1706855574112.png 1706855574112.png](https://www.blast.hk/data/attachments/218/218231-c909c13a0f0620b369acbaa34dfba03f.jpg)
5. Отображение размеров и оффсетов в HEX, когда значение больше 10
![1706855664886.png 1706855664886.png](https://www.blast.hk/data/attachments/218/218232-73821667cb76c0003bcb73bf47667f0a.jpg)
6.Отображение масок для битовых полей (IDA показывает их через маски)
![1706855768883.png 1706855768883.png](https://www.blast.hk/data/attachments/218/218233-723105ae341209eb01cb087e01fc2593.jpg)
7.Отображение оффсета и размера указателя на функцию в виртуальной таблице
![1706855835930.png 1706855835930.png](https://www.blast.hk/data/attachments/218/218234-5b8b0d31ff1b238a1123a6be3d5f01ca.jpg)
8. Отображение имен аргументов в указателях на функции (в обычной версии отображаются только типы)
* В 19.x эта фича принята в основной clangd и может работать без патченой версии
![1706856030415.png 1706856030415.png](https://www.blast.hk/data/attachments/218/218235-bf596a73f34ec9eaafa13271d4ce7931.jpg)
9. Отображение суммарного количества всех паддингов в структуре
![1706856112285.png 1706856112285.png](https://www.blast.hk/data/attachments/218/218236-ccc89be72cf82ac3b1890b2d87181ce4.jpg)
10. Частичная поддержка non-self-contained заголовков
![1706856264354.png 1706856264354.png](https://www.blast.hk/data/attachments/218/218237-d45eb860e070211d988d5a5051d57865.jpg)
11. Подписывание имен аргументов для функций врапперов
![1706860280647.png 1706860280647.png](https://www.blast.hk/data/attachments/218/218241-ebe5008bd5cdffcb33958cd4de2e2ecc.jpg)
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++, но есть так же крутое расширение CodeLLDBCodeLLDB крут тем, что это очень качественная обертка над lldb - можно задать команды инициализации и даже больше:
- можно генерировать HTML через брейкпоинты строя графики, или записывая логи;
- поддерживается reverse-отладка (когда выполнение кода откатывается назад)
- удаленная отладка (например под android)
Статический анализатор
clangd уже имеет часть аналитик от clang-static-analyzer и интеграцию с clang-tidy, но там доступны только быстрые проверкиБолее медленные проверки, такие как утечки памяти можно запустить через CodeChecker
CodeChecker поддерживает следующие анализаторы:
- clang-static-analyzer
- clang-tidy
- cppcheck
- gcc-static-analyzer (выключен по умолчанию, и подходит в основном только для C)
![1713110106130.png 1713110106130.png](https://www.blast.hk/data/attachments/224/224751-dc32202e11eecff0e51af8b93efb04a2.jpg)
P.S. clang из дефолтной поставки android-ndk не умеет в CTU (утечки не найдет)
CodeCoverage или просмотр посещенных/не посещенных участков кода при выполнении
Coverage Gutters выводит информацию из lcov файлов, а сами lcov файлы можно сгенерировать при помощи Lcov Generator (он поддерживает интеграцию с CMake и launch.json)![1713108782681.png 1713108782681.png](https://www.blast.hk/data/attachments/224/224749-a3e12971514966da303b80b4a69e0a82.jpg)
Данный сниппет включает генерацию 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 1713108300046.png](https://www.blast.hk/data/attachments/224/224745-9a4d364db979b9223acbd0ce2f98672c.jpg)
Патченная версия с возможностью задать свои аргументы для генерации asm-кода:
Так же в аргументы можно подкинуть grep через пайп, что бы порезать лишнее и ускорить парсинг (расширение все парсит регексами)
Так же в аргументы можно подкинуть 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
Последнее редактирование: