Компилятор и Visual Studio Code видят разные функции под MessageBox()
Недавно поставил Visual Studio Code, скачал расширение от Microsoft для C/C++, использую компилятор g++ 13.1.0 и CMake 3.26.3. Всё хорошо работает, программы компилируются, но как только я попытался вызвать MessageBox, получился конфликт между Visual Studio Code и компилятором. main.cpp:
#include <Windows.h>
int main() {
MessageBox(NULL, L"Message", L"Box", MB_ICONINFORMATION);
return 0;
}
Здесь 2 и 3 параметры имеют тип LPCWSTR, и ошибки не подсвечиваются, но как только я начинаю компилировать программу, вижу это:
error: cannot convert 'const wchar_t*' to 'LPCSTR' {aka 'const char*'}
4 | MessageBox(NULL, L"Hello", L"World!", MB_ICONMASK);
| ^~~~~~~~
| |
| const wchar_t*
Как только я убираю приставку L, 2 и 3 параметры имеют тип LPCSTR, и программа компилируется, но жутко режут глаза сообщения об ошибках. Я понял, что Visual Studio Code видит эту функцию как MessageBoxW, но при компиляции она является MessageBoxA. Как заставить компилятор и Visual Studio Code видеть одну и ту же функцию?
Ответы (1 шт):
Советую попробовать clangd вместо C/C++ extension от майкрософт.
Плюсы:
- опенсорсный, не принадлежит майкрософт, не нужен microsoft extensions marketplace
- можно использовать для любой другой среды, не только VSCode
- можно настроить много семантического хайлатинга, т.е. раскрашивания кода не по регуляркам, а по C++ категориям (например, все классы одним цветом, а все операторы - другим), которые регулярки определяют неточно; в С/C++ extension меньше опций для этого
Он должен автоматически использовать те же опции, что ты используешь при сборке. Он берёт их из файла compile_commands.json, который обычно генерится автоматически исходя из твоего CMakeFiles.txt или Makefile. Так что если там будут другие опции, то ты сразу увидишь, почему так.