Компилятор и Visual Studio Code видят разные функции под MessageBox()

Рейтинг: 0Ответов: 1Опубликовано: 07.06.2023

Недавно поставил 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 от майкрософт.

Плюсы:

  1. опенсорсный, не принадлежит майкрософт, не нужен microsoft extensions marketplace
  2. можно использовать для любой другой среды, не только VSCode
  3. можно настроить много семантического хайлатинга, т.е. раскрашивания кода не по регуляркам, а по C++ категориям (например, все классы одним цветом, а все операторы - другим), которые регулярки определяют неточно; в С/C++ extension меньше опций для этого

Он должен автоматически использовать те же опции, что ты используешь при сборке. Он берёт их из файла compile_commands.json, который обычно генерится автоматически исходя из твоего CMakeFiles.txt или Makefile. Так что если там будут другие опции, то ты сразу увидишь, почему так.