2013-08-28 3 views
0

Когда я беру что-то же просто, как это:с ++ переменная Синтаксис объявления

char text1[] = "hello world"; 
MessageBox(NULL, text1, NULL, NULL); 

Я получаю эту ошибку:

Error 1 error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [12]' to 'LPCWSTR' 
+1

'символ text1 [] = ...' является то, что вы ищете. –

+0

Ну, 'wchar_t text1 []' (или 'std :: wstring'). – chris

+0

В C++ вы использовали бы 'std :: string'. – typ1232

ответ

0

char является single character, а не строка.

Вам нужен Юникод, вы можете использовать TCHAR;

TCHAR[] text = _T("Hello World."); 
MessageBox(NULL, text, NULL, NULL); 
+0

ошибка C2664: 'MessageBoxW': невозможно преобразовать параметр 2 из 'char [12]' в 'LPCWSTR' – user2726531

+0

@ user2726531 отредактировал ответ. Вам просто нужен символ Юникода. – JNL

4

У вас есть две основные проблемы. Во-первых, char может содержать только один символ, а не строку символов. Во-вторых, у вас есть «узкий» символьный строковый литерал, но вы (видимо) используете сборку Unicode вашего приложения, в которой MessageBox ожидает получить широкую строку символов. Вы хотите, чтобы либо:

wchar_t text1[] = L"hello world"; 

или:

wchar_t const *text1 = L"hello world"; 

или (чаще всего):

std::wstring text1(L"hello world"); 

... но обратите внимание, что std::wstring не может быть передано непосредственно в Messagebox. Вы должны были бы либо пройти text1.c_str() при вызове MessageBox, либо написать небольшую обертку для MessageBox, что принял (ссылка) а std::wstring, что-то вроде:

void message_box(std::wstring const &msg) { 
    MessageBox(NULL, msg.c_str(), NULL, MB_OK); 
} 
+0

ошибка C2228: слева от '.c_str' должен быть класс/struct/union – user2726531

+0

@ user2726531: Похоже, вам нужно добавить '#include '. –

+0

Но теперь произошла новая ошибка: ошибка C2601: «MessageBoxW»: локальные определения функций незаконны – user2726531

0

строковый литерал в C/C++ не a char, но коллекция значений char. Идиоматический способ объявления этого

const char* text1 = "hello world"; 
+0

ошибка C2664: 'MessageBoxW': невозможно преобразовать параметр 2 из 'const char *' в 'LPCWSTR' – user2726531

+0

@ user2726531 'LPCWSTR' ссылается на строку unicode, в то время как' char * 'или' LPCSTR' ссылается на строку ANSI. Если вам нужна строка юникода, используйте 'LPCWSTR' и измените объявление на' L 'hello world' ' – JaredPar

0

char только держать один символ, а не массив символов.

Так что просто используйте указатель на постоянную строку символов Юникода.

LPCWSTR text1 = L"hello world";

+0

первый вариант работает. Второй вариант: Ошибка \t ошибка C2664: 'MessageBoxW': не может преобразовать параметр 2 из 'const char *' в 'LPCWSTR' – user2726531

Смежные вопросы