wchar_t加'L与不加'L'为何不同?

yangyira2 2007-05-04 03:29:23
#include <iostream>
using namespace std;
void main()
{
wchar_t w1=L'哀';
wchar_t w2='哀';
printf("%0x %0x",w1,w2);
}
为什么加'L'与不加'L'输出会不同?
...全文
1863 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyira2 2007-05-06
  • 打赏
  • 举报
回复
不对啊!
我说的是加上'_TEXT' 运行的结果就跟没加'L'一样了
就是说:
WCHAR w1 = _TEXT('哀');//没被"经过预处理器后就是:wchar_t w1 = L'哀';"
wchar_t w2='哀';
printf("%0x %0x",w1,w2);
打印的结果是一样的.
  • 打赏
  • 举报
回复
wchar_t w1=L'哀';//这个是unicode编码
wchar_t w2='哀';//这个是ascii编码
输出的时候对应的内码,自然不一样了/。
yutaooo 2007-05-05
  • 打赏
  • 举报
回复
c++ 标准上是采用 L 的。这个不是宏。

windows 下编程采用的是 _TEXT, _T 则是宏。 它用来选择合适的字符集。 这个选择依赖于你是否定义了 _UNICODE 或 _MBCS . 这些设置的选择可以在编译命令行, 工程选项中 等地方进行设置。

举个例子,如果选择 _UNICODE 的工程:

TCHAR ch = _TEXT('a');

经过预处理器后就是:

wchar_t ch = L'a';

yangyira2 2007-05-05
  • 打赏
  • 举报
回复
加'L'是不是就在定义_ U N I C O D E 宏呢?
因为我原代码能够编译成功,说明已经定义了_ U N I C O D E 宏.
但我加上'_TEXT' 运行的结果就跟没加'L'一样了.

_ U N I C O D E 宏的定义是怎样回事,是不是我系统自动定义(引如)的呢?
JFDream_15 2007-05-04
  • 打赏
  • 举报
回复
所以为了能够与UNICODE兼容,而又避免错误,最好使用_TEXT或者_T来修改字符串
JFDream_15 2007-05-04
  • 打赏
  • 举报
回复 1
来自<<WINDOWS核心编程>>:

字符串前面的大写字母L ,用于告诉编译器该字符串应该作为U n i c o d e 字符串来编译。当编译器将字符串置于程序的数据部分中时,它在每个字符之间分散插入零字节。

这种变更带来的问题是,现在只有当定义了_ U N I C O D E 时,程序才能成功地进行编译。我们需要另一个宏,以便有选择地在字符串的前面加上大写字母L 。

这项工作由_ T E X T 宏来完成,_ T E X T 宏也在T C h a r. h 文件中做了定义。

如果定义了_ U N I C O D E ,那么_ T E X T 定义为下面的形式:
#define _TEXT(x) L ## x

如果没有定义_ U N I C O D E ,_ T E X T 将定义为
#define _TEXT(x) x

使用该宏,可以改写上面这行代码,这样,无论是否定义了_ U N I C O D E 宏,它都能够正确地进行编译。如下所示:
TCHAR *szError=_TEXT("Error");

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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