Моя программа строится правильно в соответствии со стандартом C++, который я установил в файле CMakeLists.txt, но Intellisense помечает новые функции как ошибки, хотя я сказал ему передать информацию о конфигурации CMake.
Я использую расширения CMake и CMake-tools в VSCode, редактируя проект C++. В моей корневой папке CMakeLists.txt у меня есть set(CMAKE_CXX_STANDARD 23)
.
В одном из моих заголовочных файлов я использую следующую функцию C++23 (несколько аргументов в операторе фигурных скобок):
Port *operator[](const string name, const size_t index) { /* .. code .. */ }
Как и ожидалось, я могу нормально собрать и запустить эту программу. Но Intellisense всегда помечает эту строку как ошибку, говоря, что здесь слишком много аргументов:
too many parameters for this operator function C/C++(344)
Мой файл c_cpp_properties.json
имеет следующее содержимое:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"intelliSenseMode": "linux-gcc-arm64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
Я также попробовал добавить "cppStandard": "c++23",
, безрезультатно.
Я использую Linux на Raspberry Pi. Pi работает без головы, и я использую расширение кода SSH VS для редактирования с другого компьютера. Однако я сомневаюсь, что это повлияет на это, потому что я считаю, что расширение C/C++ работает на pi, и я вижу одно и то же, независимо от того, подключаюсь ли я удаленно с компьютера с Windows или Linux.
@Someprogrammerdude, нет, плагин cmake может переконфигурировать intellisense на основе файлов cmake, обычно вам даже не нужно создавать c_cpp_properties.json
при его использовании
Спасибо @BoP, Intellisense использует MSVC в качестве компилятора? Это имело бы смысл, поскольку согласно en.cppreference.com/w/cpp/compiler_support/23 этот компилятор не реализовал многие функции C++23, включая эту.
а что если ты "compilerPath": "/usr/bin/g++"
?
@user никакого эффекта, все равно отображается как ошибка
@wcroughan IntelliSense использует интерфейс C++ Edison Design Group (EDG).
Ответ в комментариях, публикуйте здесь для тех, кто столкнулся с такой же проблемой и нашел это.
Различные компиляторы и анализаторы языка реализуют функции C++ по-своему. Intellisense использует интерфейс C++ Edison Design Group (EDG). Так уж получилось, что эта функция (оператор многомерных фигурных скобок) еще не поддерживается EDG, поэтому независимо от того, какие настройки я менял, это выдавало ошибку. Он поддерживается GCC, который использовал CMake, поэтому сборка работает.
Я считаю, что единственное «решение» — дождаться, пока EDG поддержит эту функцию в будущем обновлении.
Информацию о том, какие функции поддерживаются различными языковыми парсерами и компиляторами, можно найти по этой ссылке: https://en.cppreference.com/w/cpp/compiler_support
Поддержка расширения Cpptools новой функции языка операторов многомерных индексов C++23 в IntelliSense (не в сборке, которая обрабатывается любым компилятором, который вы используете для сборки) отслеживается (несколько неофициально) с помощью заявки на выпуск Поддержка оператора индекса многомерного массива с windows-clang-x64 #11400 . Цитирую ответ Колена в этой заявке:
Расширение C/C++ использует интерфейс компилятора EDG и эквивалентно столбцу
EDG eccp
в этой таблице: https://en.cppreference.com/w/cpp/compiler_support/23Мы оставим эту проблему открытой для отслеживания, но ожидаем, что эта функция начнет работать должным образом, как только EDG добавит ее поддержку.
Intellisense — это отдельный компилятор, который иногда не реализует те же новые функции, что и «основной» компилятор. C++23 находится в стадии разработки для всех компиляторов.