宽字符字面量前缀 L 是什么意思?

yisikaipu 2012-09-02 08:11:08
咬文嚼字

1,C/C++标准里没有任何解释
2,Rationale 里只解释了为什么用前缀而不是后缀

那么,L 难道就是 Literal 的首字母?或是 Large,或是 Long ?

何不用 Wide ?据说是重用已有的 long 字面量后缀字母?

有没有确切的说法

大家认为是什么

下面是引文

C99
$6.4.5 String literals
$6.4.5/2
A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz".A wide string literal is the same, except prefixed by the letter L.

C++2003
$2.13.2 Character literals
$2.13.2/1
A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by the letter L, as in L’x’.

$2.13.2/2
A character literal that begins with the letter L, such as L’x’, is a wide-character literal. A wide-character literal has type wchar_t.

Rationale for International Standard Programming Languages C
$6.4.5 String literals
An L prefix distinguishes wide string literals. A prefix rather than a suffix notation was adopted so that a translator can know at the start of the processing of a string literal whether it is dealing with ordinary or wide characters.
...全文
912 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
Long,Short 长短
Wide,Narrow 宽窄
………………
  不同的C/C++语言维护者和英文资料作者,存在不同的喜好,所以常常一件事搞出很多说法,一个东西有很多名字。可见当初强调C/C++标准有多么必要和迫切,同样也可以发现这事并没因标准的制定而完全截尾,只不过不再那么严重,我们还没算深受其害。而翻译者们相对受苦更深。
  本来应该体谅的。但楼主在20楼列出的东西,呵呵……
  其实说实话,我素来不愿意去看清华出版的书,很久之前关于买书选择哪个出版社的一个讨论中,我就说了,原因不重复了,大家想买书就看看电子工业出版社的吧,至少我在某段时期常泡图书馆的时候,曾经有心地比较了一下各种出版计算机技术的出版社的书的内容质量,在至少半年多的时间里,多种同类内容的书相比,电子工业出版社有绝对的质量优势。而清华的内容和“气质(一如楼主所说的那种作派)”,我早排到最后了。一个入学考生成绩最高,就业最旺的学府,不仅是书籍,包括多媒体教学光盘,其内容质量都如幼儿园一样。也许他们自视过高,认为别人都象幼儿园的程度,所以就用幼儿园般的表现来沟通了。天才的另一半是傻瓜,这在他们身上得到了验证。
redleaves 2012-09-04
  • 打赏
  • 举报
回复
个人猜测应该是long.类似于long int相对于int.
只不过long char/long string不太符合习惯所以又弄了个wchar_t...
再加之c/c++标准不规定数据尺寸,所以这个wchar_t有16位的,有32位的.
而long在c的习惯中应该只是说更大的数据,而不是指32位数据.如:long int,long double.

最终c++11又加上了u8 u U三种确定了长度的字符/字符串,现在真是乱啊
赵4老师 2012-09-04
  • 打赏
  • 举报
回复
在键盘上L比W好敲
reverse_walker 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]
引用 4 楼 的回复:

在《windows程序设计》里的P26页2.2.2更宽的字符里有这么一句话。在wchar_t=L"Hello!";下面那行我找到了依据:“注意,大写的字母L(表示长整形)”这是原文。楼主可以去看《windows程序设计》第五版 珍藏版这本书上是这么介绍的。不知道还有没有别的什么依据了。能力有限,只找到了1条依据。

L"Hello!"是用2个字节表示一个字符,在3……
[/Quote]

原文:Notice the capital L (for long) immediately preceding the first quotation mark.

charles说for long,没说type of long. 所以应该是单词long,而不是类型long
相信这个long反映的是short vs long中的这种对比关系.
一叶之舟 2012-09-04
  • 打赏
  • 举报
回复
没想到有这么多解释
常如意 2012-09-04
  • 打赏
  • 举报
回复
宽字符支持貌似是后来才增加的,应该不是之父一个人说了算吧
yisikaipu 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]在键盘上L比W好敲[/Quote]

有创意!
yisikaipu 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]看来清华大学那帮教授搞翻译的也有翻译错的时候,但是小弟不才,英文没有学好,只能看中文版的。
另外不知道楼主往后面看没看? 2.2.3节它从一个侧面证明了LONG的翻译,希望楼主往后看。[/Quote]


中译本第一看,呵呵

目录之前有长达10页的“中文版翻译过程”,罕见

更罕见的是这竟然是译者(方敏)自己夸自己团队的

有些地方真的有点太谦虚,比如:
“……张胜试图在 Windows 7 上用 Visual Studio 2008 创建每个程序,他花了大量的时间调查问题的原因和解决的办法,终于圆满地完成了这个难度极大的任务,向 Windows 的编程用户交上了满意的答卷。像这样的例子还是很多的。”

看来的确,“……这是我们中国式团队的性格,我们还是保留了中国人的传统,谦虚、不张扬。表面上不说什么,但心里很清楚,经过多少个夜晚和周末的努力,我们终于成功了!”

其结束语很牛:
“……在短短的5个月内,组织了……,高质量地完成了这本书的翻译……”

其实吧,这如果是写给领导或者财主看的,正如其交代的“这次出版也是为清华大学100周年校庆献上的一个小礼……”,那也就罢了

但是如果写给读者看的,这也太谦虚了!

我浏览了一下第3章,译者是段菲。方敏在“中文版翻译过程”中介绍“段菲是清华大学博士研究生,他曾经独立翻译过《精通 Windows 3D 图形编程》一书,在项目过程中他提出过很好的改进翻译质量的建议。”

在短短的时间里,译得确实不算差,但自认为高质量,还是太谦虚了。举一个例子来看看到底译得怎么样

$3.1.4 窗口类的注册
同时,我也放宽了各种指针的定义。相信你也绝对不会在代码中乱堆一些以 LP 和 NP 为首的变量类型。

原文:I'll also go easy on the various pointer definitions. There's no reason for you to clutter up your code with variable types beginning with LP and NP.

译者说此书的翻译并不严格对照原文,译文用词会有增删。这其实挺偷懒的,但也还无妨

但无论如何,总不能错译吧

放宽?!

我知道翻译是很费劲的,我也译不出更好的,但至少我知道这里的 go easy on 的直接意思明显就是:少用,不多用,适量地用,慎用

而且这个意思在英文里比比皆是,只要认真一点就不该不知道

细节就不苛求了,但是就我浏览过的一小部分的感觉,我敢说:“像这样的例子还是很多的”!
yisikaipu 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]看来清华大学那帮教授搞翻译的也有翻译错的时候,但是小弟不才,英文没有学好,只能看中文版的。
另外不知道楼主往后面看没看? 2.2.3节它从一个侧面证明了LONG的翻译,希望楼主往后看。[/Quote]

这本书只做为手册翻阅,感觉很多地方都不严谨的,虽然无所谓

没有通读过,尤其前面几章。刚才读了一下,没有找到更多 L 的溯源

不可能是 LONG(长整型),因为说不通

你说的这节里,反而恰恰证实了作者的 wchar_t 就是 unsigned short。这怎么会是 LONG 呢?
shen_wei 2012-09-03
  • 打赏
  • 举报
回复
这个问题。。只能是设计者想的吧。。
图灵狗 2012-09-03
  • 打赏
  • 举报
回复
是啊,就是定义了这样一个标准。1990年的Rationale for the ANSI C Programming Language这本书有提到这个前缀,但是没有说明原因。另外后续的C++11标准用的是U前缀。
iamnobody 2012-09-03
  • 打赏
  • 举报
回复
很明显,是为了纪念我的头像.
yrnaaa 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

在《windows程序设计》里的P26页2.2.2更宽的字符里有这么一句话。在wchar_t=L"Hello!";下面那行我找到了依据:“注意,大写的字母L(表示长整形)”这是原文。楼主可以去看《windows程序设计》第五版 珍藏版这本书上是这么介绍的。不知道还有没有别的什么依据了。能力有限,只找到了1条依据。
[/Quote]
L"Hello!"是用2个字节表示一个字符,在32位的机器里,long应该是4个字节,难道L“Hello!”是16位机器发明的?还是用两个字节就能表示全部字符?
dhdahai 2012-09-03
  • 打赏
  • 举报
回复
这个问题还真没考虑过
图灵狗 2012-09-03
  • 打赏
  • 举报
回复
钻研的精神值得钦佩,这是咱们中国非常缺乏的。
herman~~ 2012-09-03
  • 打赏
  • 举报
回复
用就是了,管它谁定义的
nkwyn 2012-09-03
  • 打赏
  • 举报
回复
这个还真没有深究过,上面各位的说法还是挺有用的
yisikaipu 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]看来清华大学那帮教授搞翻译的也有翻译错的时候[/Quote]


由“中文版翻译过程”可知,译者的第一条“策略和指导”是:
发挥我们团队的技术能力和对 Windows 的理解,在翻译的准确性上下功夫,不是简单地从字面上翻译,而是让读者能理解技术原理

那么再来看一例高质量翻译 :)

$3.1.5 窗口的创建
“……需要说明的是,事实上还有另外两个用于创建窗口的函数,即 CreateWindowA 和 CreateWindowW,这两个函数将头两个参数分别当作 ASCII 和 UNICODE 字符来处理。”

稍有点“理解技术原理”的人都知道这里肯定译错了,因为 CreateWindow 只是一个宏,而不是函数。而且也只有这两个函数,而不是“还有另外两个”

原文明明就是毫无歧义的:
At this point I won't bother to mention that there are actually a CreateWindowA function and a CreateWindowW function, which treat the first two parameters to the function as ASCII or Unicode, respectively.
cbzjzsb123 2012-09-03
  • 打赏
  • 举报
回复
看看`
dataxdata 2012-09-03
  • 打赏
  • 举报
回复
可能是从long value = 100L;这类用法延伸过来的
加载更多回复(16)

65,189

社区成员

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

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