Укажите версию командной строки C++ для cl.exe (код Visual Studio)

Я тестирую атрибут C++17 fallthrough в Visual Studio. Код. Среда IDE настроена на компиляцию кода C/C++ с помощью компилятора Microsoft Visual Studio cl.exe. Мое определение задачи (в tasks.json) для создания простого файла .cpp в режиме DEBUG:

{
    "type": "shell",
    "label": "cl.exe: Build active file",
    "command": "cl.exe",
    "args": [
        "/Zi",
        "/EHsc",
        "/Fe:",
        "${file}",
        "/link",
        "/OUT:${fileDirname}\\${fileBasenameNoExtension}.exe"
    ],
    "options": {
        "cwd": "${workspaceFolder}"
    },
    "problemMatcher": [
        "$msCompile"
    ]
}

Это было проверено на нескольких программах и работает хорошо. Теперь я включаю оператор switch, используя новый атрибут [[fallthrough]];, и компилятор генерирует:

warning C5051: attribute 'fallthrough' requires at least '/std:c++17'; ignored

Добавление "/std:c++17", к аргументам для cl.exe ничего не изменило (генерируется такое же предупреждение компилятора). Вот новая версия:

"args": [
    "/Zi",
    "/EHsc",
    "/Fe:",
    "/std:c++17",
    "${file}",
    "/link",
    "/OUT:${fileDirname}\\${fileBasenameNoExtension}.exe"
],

Насколько я вижу, мой синтаксис верен в соответствии с Документация Microsoft для указания языкового стандарта.

Что я делаю не так?


person AlainD    schedule 15.07.2020    source источник
comment
code.visualstudio.com/docs/cpp/config-msvc вы можете проверить эта ссылка   -  person Nilesh Solanki    schedule 15.07.2020
comment
Если вам нужен больший контроль над расширением C/C++, вы можете создать файл c_cpp_properties.json, который позволит вам изменять такие параметры, как путь к компилятору, включаемые пути, стандарт C++ (по умолчанию C++17), и более.   -  person Nilesh Solanki    schedule 15.07.2020
comment
О, хороший совет! Вы имеете в виду с параметром "compilerArgs" в c_cpp_properties.json?   -  person AlainD    schedule 15.07.2020
comment
вы можете предпочесть приведенную выше ссылку, например.   -  person Nilesh Solanki    schedule 15.07.2020
comment
Хм, добавил "cppStandard": "c++17" в файл \.vscode\c_cpp_properties.json, но все равно получаю то же предупреждение requires c++17 ...ignored. Синтаксис довольно громоздкий!   -  person AlainD    schedule 16.07.2020
comment
Я заметил, что если я добавлю полный путь к cl.exe в параметре "includePath" для c_cpp_properties.json и НЕ ЗАПУСКУ Visual Studio Command Prompt, компиляция завершится ошибкой с 'cl.exe' is not recognized as an internal or external command. Я думаю, что мой c_cpp_properties.json не берется и не применяется, и я не понимаю, почему.   -  person AlainD    schedule 16.07.2020
comment
Эта ссылка на провал уже связана с вопросом. Сам код не имеет отношения к вопросу (на самом деле это именно код в этой ссылке)... любая функция С++ 17 будет генерировать такое же предупреждение.   -  person AlainD    schedule 16.07.2020
comment
Почему вы беспокоитесь о файле .json? Если вы используете командную строку VS Developerscmd.exe или PowerShell), просто скомпилируйте свою программу, например cl /Zi /EHsc /FeYourExeName /std:c++17 YourSource.cpp (вы должны добавить /W3, чтобы включить полные предупреждения. Вы можете добавить /Fo..., чтобы указать имя объектного файла, если хотите. Дело в том, что если вы компилируете из командной строки, файл .json не требуется. Простой файл .bat может обрабатывать ваше имя файла, имя объекта и аргументы exename.   -  person David C. Rankin    schedule 24.11.2020


Ответы (1)


Я нашел эту проблему, когда искал что-то еще, но вот исправление для вас :).

Ваша проблема заключается в порядке, в котором вы приводите аргументы. /Fe: ожидает путь к файлу сразу после - https://docs.microsoft.com/en-us/cpp/build/reference/fe-name-exe-file?view=msvc-160

Вот пример раздела args, взятого из документации VSCode, но я добавил /std:c++17 флаг компилятора

"args": [
    "/Zi",
    "/EHsc",
    "/std:c++17", // <= put your compiler flag here
    "/Fe:", // <= /Fe: followed by the path + filename
    "${fileDirname}\\${fileBasenameNoExtension}.exe",
    "${file}"
]

Надеюсь, это поможет, удачного кодирования!

person underscoreHao    schedule 23.11.2020