游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4861|回复: 9

问一下字符串前加一个L是什么作用

[复制链接]

6

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
发表于 2006-5-30 20:24:00 | 显示全部楼层 |阅读模式
win32程序里面很多地方需要在字符串前面加一个大写的L编译才能通过。这个L起的什么作用啊?如果我的字符串是通过形参传入的呢,怎么加这个L呢?

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-5-31 11:33:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

表示那个字符串是宽字符的,参数用wchar_t*或const wchar_t*

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2006-5-31 13:50:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

宽字符和uft-8编码是什么关系?还有gb编码,big编码。

5

主题

189

帖子

189

积分

注册会员

Rank: 2

积分
189
发表于 2006-5-31 14:31:00 | 显示全部楼层

Re: 问一下字符串前加一个L是什么作用

是个强制类型转换的宏 [em21] [em21]

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-5-31 14:59:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

gb是国标码,大陆用的,big5是台湾用的.
UTF-8编码应该是Unicode的常用表现形式吧,我在网上搜到这个
http://www.itlearner.com/code/unicode.htm

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-5-31 15:16:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

噢,好像不对.
这个看起来好些
http://hmily.blueidea.com/archives/2006/1809.shtml

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-5-31 16:57:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

加个L是UTF16编码

6

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2006-5-31 18:45:00 | 显示全部楼层

Re:问一下字符串前加一个L是什么作用

翻了下书,应该是这样的。
     先从编码说起,ascii码大家都知道,ascii码本来是7位的,后来为了支持罗马字母等,扩展至8位,也就是一个字节的大小。可是1个字节仍然不能容纳汉字等字符,为此,又扩展出了双字节字符集,即dbcs。但是dbcs,有些字符为1个字节,有些字符2个字节,所以十分笨拙,无法满足需要。为了解决这个问题,最简单的办法就是扩展字符集为16位,就诞生了unicode,采用16位,既两个字节,可以涵盖目前所有的字符和符号。unicode是一种宽字符集。在window环境下,我们基本可以将unicode和宽字符集对等。
     从window nt开始,就从底层支持unicode,98不完全支持unicode,所以在98下的程序一般是不采用unicode字符集的。从c语言上来说,主要问题是动态链接库的问题。现在这些库都已经重写了。

在winnt.h中,有
typedef unsigned short wchar_t;
在wchar.h中有
typedef char CHAR;
typedef wchar_t WCHAR;

楼主所看到应该是这样的形式:
wchar str = L"Hello!";
这个大写的L告诉编译器下面这几个字符是宽字符,每个字符要分配2个字节的内存。
如果忘记加L,编译器一般会给出警告或者错误信息。
如果只是简单的如
wchar a = 'a';
编译器应该直接进行0扩充了。

为了写出统一的,不用针对16位和8位字符集做特别修改的代码,有几个方法。
一个是 vs带有的一个tchar.h头文件
包含这个头文件后,如果我们
#define _UNICODE
那么就有
typedef wchar_t TCHAR;
#define __T(x) L##x     //表示把L粘贴到x前面
#define _T(x) __T(x)
如果没有定义_UNICODE标示符,那么有
typedef char TCHAR
这样对应不同的字符集,我们只需增加或者删除一条语句。

还有一种方法,在winnt.h头文件中,也有类似的定义
包含了winnt.h是,若定义了UNICODE(没有下划线)
则有
typedef WCHAR TCHAR
并有
#define __TEXT(quote) L##quote
#define TEXT(quote) __TEXT(quote)
若没有定义UNICODE
便是#define char TCHAR

因此,我想我们应该这样写程序
#include <winnt.h>
#define UNICODE

TCHAR a[] = TEXT("Hello!");
通过是否定义UNICODE标示符来适应窄字符集和宽字符集。

看的书是Windows 程序设计(第5版)  Charles Petzold著
更详细内容请查阅该书第2章
不足之处请大家指教
[em3] [em3] [em3]

55

主题

331

帖子

337

积分

中级会员

Rank: 3Rank: 3

积分
337
发表于 2006-5-31 23:04:00 | 显示全部楼层

Re: Re:问一下字符串前加一个L是什么作用

prefetchnta: Re:问一下字符串前加一个L是什么作用

加个L是UTF16编码


简单又正确。顶

13

主题

31

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2006-6-4 21:04:00 | 显示全部楼层

Re: 问一下字符串前加一个L是什么作用

请问这个宏是在哪定义的 为什么我在自己的项目中使用不成功?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表