ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   VSCode как C++ IDE (https://forum.antichat.xyz/showthread.php?t=1502243)

SR_team 02.02.2024 11:55

В сети крайне мало толковых билдов под 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-документации

2. CodeLens - добавляет над функциями, классами и типами ссылки на использование/наследования (при клике показывает все ссылки)

Отключить можно добавив в настройках расширения аргумент
Код:

--code-lens=false
3. Postfix completion - добавляет в автодополнение виртуальные операции для генерации свитчей, циклов и кастов

Видео-демка (смотреть обязательно - топ фича от sammcall)

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

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

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

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

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

* В 19.x эта фича принята в основной clangd и может работать без патченой версии

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

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

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

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 (иначе могут быть ложные срабатывания)

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

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

Цитата:

Сообщение от Спойлер

Данный сниппет включает генерацию 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

Цитата:

Сообщение от Спойлер

Патченная версия с возможностью задать свои аргументы для генерации asm-кода:

cxx-compiler-explorer-0.7.4.vsix

Nextcloud - a safe home for all your data

nc.sr.team


Так же в аргументы можно подкинуть 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

vmprotect 02.02.2024 12:19

Благодарю

но цлион остается в наших сердцах

kin4stat 02.02.2024 13:32

и все эти анализы полнейшная хуета, потому что под капотом ебучий clangd, который нихуя не умеет, и ломается от любой незакрытой скобки или точки запятой.

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

SR_team 02.02.2024 13:55

Цитата:

Сообщение от kin4stat

и все эти анализы полнейшная хуета, потому что под капотом ебучий clangd, который нихуя не умеет, и ломается от любой незакрытой скобки или точки запятой.

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

Фишка как раз в том, что под капотом НЕ clangd. Недостаток clangd я написал - в нем отключены все медленные анализаторы

SR_team 18.03.2024 23:23

Цитата:

Сообщение от movebx

А, собсна, как эту хуету отключить?

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

В аргументы clangd: --code-lens=false

SR_team 07.04.2024 21:46

Докинул свое расширение, которое автоматически открывает вывод CMake в случае ошибки сборки

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

cmake-build - Visual Studio Marketplace

Extension for Visual Studio Code - Wrapper for cmake-tools to open output on build fails

marketplace.visualstudio.com

sobe1t 14.04.2024 04:08

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

SR_team 14.04.2024 17:44

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

sobe1t 15.04.2024 17:00

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

SR_team 16.04.2024 00:25

Цитата:

Сообщение от sobe1t

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

опиши подробнее проблему

sobe1t 16.04.2024 03:33

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

SR_team 16.04.2024 03:57

Цитата:

Сообщение от sobe1t

Есть допустим функция по классике объявленная в .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 исключает хидеры при его генерации.

Receiver 22.06.2024 17:01

Срчик, спасибо тебе за помощь с кросскомпляцией и топовейший пропатченный clangd. Проблем действительно нет, когда Microsoft идёт на***. Надо бы сделать "Normal C/C++ Enjoyer Extensions Pack"

SR_team 05.07.2024 03:54

Сегодня смерджили API clangd, который дает full-доступ к LSP-серверу - будет обновление без модифицированного клиента - перекину все с него на отдельные плагины

Export client from activation as API for use in other extensions by thegecko · Pull Request #575 · clangd/vscode-clangd

This PR exports the language client so other VS Code extensions can take advantage of the clangd LSP features. For example, domain specific functionality (e.g. intrinsics) could be implemented in a...

github.com


UPDATE: Расширения готовы: 1, 2, 3. Но в PR обнаружился баг, ждем исправения в основной ветке

Restarting clangd break the exported API · Issue #648 · clangd/vscode-clangd

Write an extension what used the clangd API added in #575 (for example https://github.com/HighCommander4/vscode-clangd-api-example) Trigger extension activation (in provided example hover informati...

github.com


UPDATE: fix, ждем релиза новой версии на маркетплейсах

Musaigen 11.02.2025 19:20

Цитата:

Сообщение от SR_team

1. Поддержка doxygen-документации

в виде отдельного расширения можно не ждать?

SR_team 11.02.2025 23:56

Цитата:

Сообщение от Musaigen

в виде отдельного расширения можно не ждать?

Можно сделать, но надо будет дефолтный ховер отключать

https://forum.antichat.xyz/attachments/28585352/

UPD Хотя по идее можно попробовать похукать middleware клиента через API, что бы сделать без отключения

nikkymen 08.05.2025 00:34

Спасибо, очень полезная информация!

Есть ли какое-то решение для запуска таргетов?

У меня большой cmake проект и много таргетов.

Хочется уметь запускать их с различными аргументами.

Расширение cmake не дает возможность запускать их с аргументами, а в launch.json запускается только через gdb/lldb.

Неудобно капец

SR_team 08.05.2025 12:43

Цитата:

Сообщение от nikkymen

Спасибо, очень полезная информация!
Есть ли какое-то решение для запуска таргетов?
У меня большой cmake проект и много таргетов.
Хочется уметь запускать их с различными аргументами.
Расширение cmake не дает возможность запускать их с аргументами, а в launch.json запускается только через gdb/lldb.
Неудобно капец

В VSCode есть встроеная команда для запуска таргетов из launch.json без отладчика (workbench.action.debug.run). Ты так же прописываешь конифиг с отладчиком, а потом просто используешь ее вместо начала отладки

nikkymen 08.05.2025 14:12

Цитата:

Сообщение от SR_team

В VSCode есть встроеная команда для запуска таргетов из launch.json без отладчика (workbench.action.debug.run). Ты так же прописываешь конифиг с отладчиком, а потом просто используешь ее вместо начала отладки

Если посмотреть на вывод консоли, то видно, что запускается все равно через gdb, просто без брейкпоинтов. Т.е отладочные символы все равно грузятся

SR_team 08.05.2025 20:22

Цитата:

Сообщение от nikkymen

Если посмотреть на вывод консоли, то видно, что запускается все равно через gdb, просто без брейкпоинтов. Т.е отладочные символы все равно грузятся

Можешь cmake аналогичную команду использовать, но она только для cmake проектов и нельзя задать аргументы, рабочую папку и переменные среды

UPD: Из того что начитал по workbench.action.debug.run - оно использует отладчик как лаунчер, но не аттачится к процессу. Сделано, что бы соблюсти все правила описаные в launch.json, т.к. там могут быть поля специфичные для отладчика. Думаю для запуска на локальной машине можно поискать расширения с дебагером-заглушкой, который будет юзать launch.json просто как конфиг для запуска. Но для кейсов с деплоем, например apk, такое вряд ли есть. Так что встроенное решение в VSCode наверно самое нормальное в этом плане

вайега52 03.02.2026 21:40

Цитата:

Сообщение от sobe1t

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

На Windows решил это тем, что в качестве генератора начал использовать Ninja, вместо генератора визуалки. Теперь clangd и clang-tidy спокойно работают с проектами, где нужен MSVC (а в реалиях гта это особенно актуально)

.clangd:





Код:

CompileFlags
:
CompilationDatabase
:
build
-
release
Compiler
:
cl.exe
Add
:
[
"-std:c++latest"
,
"/std:c++latest"
]



CMakePresets.json:





Код:

{
"version"
:
8
,
"configurePresets"
:
[
{
"name"
:
"base-ninja"
,
"hidden"
:
true
,
"generator"
:
"Ninja"
,
"architecture"
:
{
"value"
:
"x86"
,
"strategy"
:
"external"
}
,
"toolset"
:
{
"value"
:
"host=x86"
,
"strategy"
:
"external"
}
,
"cacheVariables"
:
{
"CMAKE_EXPORT_COMPILE_COMMANDS"
:
"ON"
,
"CMAKE_C_COMPILER"
:
"cl.exe"
,
"CMAKE_CXX_COMPILER"
:
"cl.exe"
}
}
,
{
"name"
:
"x86-debug"
,
"displayName"
:
"GTA SA (MSVC x86 Debug)"
,
"inherits"
:
"base-ninja"
,
"binaryDir"
:
"${sourceDir}/build-debug"
,
"cacheVariables"
:
{
"CMAKE_BUILD_TYPE"
:
"Debug"
}
}
,
{
"name"
:
"x86-release"
,
"displayName"
:
"GTA SA (MSVC x86 Release)"
,
"inherits"
:
"base-ninja"
,
"binaryDir"
:
"${sourceDir}/build-release"
,
"cacheVariables"
:
{
"CMAKE_BUILD_TYPE"
:
"Release"
}
}
]
,
"buildPresets"
:
[
{
"name"
:
"debug"
,
"configurePreset"
:
"x86-debug"
}
,
{
"name"
:
"release"
,
"configurePreset"
:
"x86-release"
}
]
}



Время: 08:09