error C2664 cannot convert argument 1 from 'const wchar_t [9]' to 'TCHAR *'

344
15 ноября 2021, 11:10

Прекрасно компилируется в codeblocks а в Visual studio выдает

error C2664 cannot convert argument 1 from 'const wchar_t [9]' to 'TCHAR *' message : Conversion from string literal loses const qualifier (see /Zc:strictStrings) message : see declaration of 'MessageBoxPrintf'

В чем причина?

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int CDECL MessageBoxPrintf(TCHAR* szCaption, TCHAR* szFormat, ...)
{
    TCHAR szBuffer[1024];
    va_list pArgList;
    // The va_start macro (defined in STDARG.H) is usually equivalent to:
    // pArgList = (char *) &szFormat + sizeof (szFormat) ;
    va_start(pArgList, szFormat);
    // The last argument to wvsprintf points to the arguments
    wprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR),
                szFormat, pArgList);
    // The va_end macro just zeroes out pArgList for no good reason
    va_end(pArgList);
    return MessageBox(NULL, szBuffer, szCaption, 0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    int cxScreen, cyScreen;
    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);
    MessageBoxPrintf(TEXT("ScrnSize"),
                     TEXT("The screen is %i pixels wide by %i pixels high."),
                     cxScreen, cyScreen);
    return 0;
}

пример и книжки Charles Petzold Programming Windows 5th Ed

Answer 1

В языке С++ строковые литералы не разрешается неявно преобразовывать к указателям на не-константу, о чем вам и говорит компилятор. Функция MessageBoxPrintf должна быть объявлена с параметрами типа const TCHAR *, а не TCHAR *.

А книжка ваша была написана во времена динозавров, то есть во времена первого стандарта С++98, в котором такое неявно преобразование разрешалось для совместимости с C.

То, что у вас это "прекрасно компилируется в codeblocks" возможно означает что ваш codeblocks работает в старинном режиме C++98. Есть также вероятность, что в codeblocks вы компилировали этот код в режиме С.

Также, здесь написана белиберда

wprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR),
        szFormat, pArgList);

Подозреваю, что имелся в виду vswprintf? В книге использован именно wprintf?

Также, использование va_list требует <stdarg.h>, а использование vswprintf требует <wchar.h>.

READ ALSO
Фильтрация дискретного сигнала

Фильтрация дискретного сигнала

На фото есть кривая, которая в общем случае через каждые Δx состоит из двух точек (в реальности это координаты двух рядом проложенных проводов)

97
Использование 64-bit кода и 32-bit данных

Использование 64-bit кода и 32-bit данных

Какие преимущества дает использование 64-bit кода и 32-bit данных?

157
Как соединить два массива в С++

Как соединить два массива в С++

Вот такой кодПри выполнении ввожу: 5, (1,2,3,4,5), 5 (6,7,8,9,10), получаю -858993460 -858993460 -858993460 -858993460 -858993460 1 2 3 4 5

166
Решение СЛАУ с помощью библиотеки Eigen C++

Решение СЛАУ с помощью библиотеки Eigen C++

Я хочу воспользоваться методами библиотеки Eigen для решения СЛАУЯ взяла пример из файла документации и проект не компилируется

178