注册 登录
编程论坛 C++教室

请教VS2010关于字符转换的一个问题

hsnowirp 发布于 2011-03-19 13:22, 2874 次点击
我编写的程序是:
59 case WM_CHAR:
60     char szChar[20];
61     sprintf_s(szChar,"char is %d",wParam);
62     MessageBox(hwnd,szChar,"char_test",0);
63    break;

调试后出现错误:
1>f:\vc++\vclesson\lesson1\winmain\winmain\winmain.cpp(62): error C2664: “MessageBoxW”: 不能将参数 2 从“char [20]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

在网上查了下,原来VS2010默认是Unicode字符集,MessageBox实际是MessageBoxW,字符需要用_T()转换为Long,我做了如下尝试:

(1)61行改为:sprintf_s(szChar,_T("char is %d"),wParam); 提示错误:
1>f:\vc++\vclesson\lesson1\winmain\winmain\winmain.cpp(61): error C2665: “sprintf_s”: 2 个重载中没有一个可以转换所有参数类型
1>          d:\program files\microsoft visual studio 10.0\vc\include\stdio.h(323): 可能是“int sprintf_s<20>(char (&)[20],const char *,...) throw()”
1>          d:\program files\microsoft visual studio 10.0\vc\include\stdio.h(321): 或       “int sprintf_s(char *,size_t,const char *,...)”
1>          尝试匹配参数列表“(char [20], const wchar_t [11], WPARAM)”时

(2)62行改为:MessageBox(hwnd,_T(szChar),"char_test",0); 提示错误:
1>f:\vc++\vclesson\lesson1\winmain\winmain\winmain.cpp(62): error C2065: “LszChar”: 未声明的标识符


请问如果想把一个参数用_T()转换类型,应该如何编写程序?
另外,我在网上看到有人说使用_T()解决这个办法比更改VS2010字符集为多字节字符集要好,这是为什么?

[ 本帖最后由 hsnowirp 于 2011-3-19 13:24 编辑 ]
3 回复
#2
rjsp2011-03-19 15:19
要么
char szChar[20];
sprintf_s(szChar,"char is %d",wParam);
MessageBoxA(hwnd,szChar,"char_test",0);

要么
wchar_t szChar[20];
swprintf_s(szChar,L"char is %d",wParam);
MessageBoxW(hwnd,szChar,L"char_test",0);

要么
TCHAR szChar[20];
_stprintf_s (szChar,_T("char is %d"),wParam);
MessageBox(hwnd,szChar,_T("char_test"),0);
#3
玩出来的代码2011-03-19 17:28
最好的就是选择第3个,同时兼顾ansi与unicode字符集,LZ搜一下这两个就会明白些、
#4
hsnowirp2011-03-19 20:15
多谢了!

就是觉得以后编写字符的时候都要加上_T() 有点麻烦~
1