TRACE宏中的formatstring

maybe5 2009-02-09 11:41:25
请问为何
CString str("big world");
TRACE(_T("%s"),str); //输出了 big world
TRACE(("%s\n"),str); //输出了 b
一定要将%s\n"通过_T转成Unicode,才能正确输出 "big world"?
...全文
248 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
捕鲸叉 2009-02-13
  • 打赏
  • 举报
回复
非unicode,0b0i0g...,就解释成只有一个字母b的字符串了
waizqfor 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ltc_mouse 的回复:]
TCHAR应该有两个定义,lz细心找找~

这篇文章也许对你有帮助:
http://www.vckbase.com/document/viewdoc/?id=1082
[/Quote]
文章不错 UP
cppfaq 2009-02-10
  • 打赏
  • 举报
回复
TCHAR--MBCS/Unicode,具体由编译器设置
L/_T--Unicode
常量字符串如"somestr"--MBCS
所以:
当编译器设置为Unicode的时候:
TRACE(_T("%s\n"),str):
格式串为Unicode,str为Unicode,故正确打印

TRACE("%s\n",str):
格式串为MBCS,str为Unicode
由于是x86CPU使用LittleEndian,对于英文字母而言其表示为0xnn,0x00,所以只打印
一个字符。如果你的str第一个字符为中文,你将更加郁闷。比如str="中国",打印结果将为:?cob

当编译器设置为MBCS的时候:
TRACE(_T("%s\n"),str):
格式串为Unicode,str为MBCS。打印应该出错,但是VS实际输出正确,这说明宏TRACE--...--最后调了AtlTraceVU,而AtlTraceVU肯定是内部做了处理。

TRACE("%s\n",str):
格式串为MBCS,str为MBCS,故打印正确
maybe5 2009-02-09
  • 打赏
  • 举报
回复
都不屑作答?
arong1234 2009-02-09
  • 打赏
  • 举报
回复
几乎所有字符串都应该用_T括起来吧
ltc_mouse 2009-02-09
  • 打赏
  • 举报
回复
TCHAR应该有两个定义,lz细心找找~

这篇文章也许对你有帮助:
http://www.vckbase.com/document/viewdoc/?id=1082
maybe5 2009-02-09
  • 打赏
  • 举报
回复
经验证:
当项目配置为Unicode时,TRACE(("%s\n"),str);只能打印str的第一个字符。
而当项目配置为Multi-Byte Character Set时,能够打印str的全部字符。
三楼的推论与实验相符,但是:

疑惑:
可以在头文件中看到TCHAR实际就是typedef char TCHAR
而一个常量字符串也无非就是const char[n]之流,两者的编码都应该是跟项目配置相关啊,怎么会出现上面的情况呢?

ltc_mouse 2009-02-09
  • 打赏
  • 举报
回复
对MFC不熟,尝试解释下,有错的话请lz见谅
CString的字符类型是TCHAR,即与项目配置的字符集有关,当项目为Unicode时,它为unicode
lz的项目应该是配置成unicode了,因而第一个TRACE(_T("%s"),str)能显示完整字符串,格式串_T变成unicode,str也是unicode,正确
第二个TRACE(("%s\n"),str)格式串是多字节串,而str是unicode,看成多字节串(或者称ANSI字符串吧),就是'b',接一个'\0'了
可以使用TRACE(("%ls\n"),str)打印unicode字符串
因而,为了做到与项目配置无关,最好都使用TCHAR,即对常量字符串加_T
herman~~ 2009-02-09
  • 打赏
  • 举报
回复
mark

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧