C和C ++中的多字符文字

问题描述 投票:40回答:6

我不知道C和C ++允许multicharacter literal:不是'c'(在C中为int类型,在C ++中为char),而是'tralivali'(类型为int !)

multicharacter literal

标准说:

C99 6.4.4.4p10:“包含的整数字符常量多个字符(例如'ab'),或包含角色或转义符没有映射到一个序列单字节执行字符是实现定义的。”

我发现它们在enum { ActionLeft = 'left', ActionRight = 'right', ActionForward = 'forward', ActionBackward = 'backward' }; 中得到了广泛的使用。但是我想当我们谈论与平台无关的序列化时,它们并不安全。 Thay也会令人困惑,因为看起来像字符串。那么多字符文字的使用范围是什么,它们对某些东西有用吗?它们使用C ++仅仅是为了与C代码兼容吗?是否以goto运算符将它们视为不好的功能?

c++ c syntax literals
6个回答
20
投票

我不知道这种用法的使用范围,但是“实现定义”对我来说是一个很大的危险信号。据我所知,这可能意味着该实现可以选择忽略您的字符名称,并在需要时仅分配常规的增量值。它可能做些“更小”的事情,但是您不能依赖于整个编译器(甚至编译器版本)的行为。至少“ goto”具有可预测的(如果不希望的话)行为...

无论如何,那是我的2c。

编辑:在“实现定义”上:

来自C4 engine

实现定义-为以下目的定义的C ++语义每个实现而不是标准中规定的每个实施。一个例子是大小一个int(必须至少为16位,但可以更长)。避免实现定义的行为只要有可能。也可以看看:未定义。 TC ++ PL C.2。

也...

未定义-C ++的一个方面没有合理意义的语义行为是必需的。一个例子是用值解引用指针零。避免未定义的行为。看到还:实现定义。 TC ++ PLC.2。

我相信这表示该评论是正确的:尽管未指定其他内容,但至少应编译。还要注意定义中的建议。


29
投票

它使在内存转储中选择值更容易。

示例:

Bjarne Stroustrup's C++ Glossary

vs。

enum state { waiting, running, stopped };

以下语句后的内存转储:

enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };

可能看起来像:

s = stopped;

在第一种情况下,vs:

00 00 00 02 . . . .

使用多字符文字。 (当然,它说的是“停止”还是“电位器”取决于字节顺序)


5
投票

我已经看到并使用了四个字符文字。它们映射到4个字节=一个32位字。如上所述,它对于调试非常有用。可以在带有int的switch / case语句中使用它们,这很好。

[这(4个字符)是相当标准的(即至少受GCC和VC ++支持),尽管结果(编译的实际值)可能因一个实现而异。

但是超过4个字符?我不会用。

更新:从C4页面:“对于我们的简单操作,我们将仅提供一些值的枚举,这在C4中通过指定四个字符的常量来完成”。因此,就像我的情况一样,他们使用的是4个字符。


3
投票

多字符文字使您可以通过等效的字符表示来指定73 74 6F 70 s t o p 值。对于枚举,FourCC代码和标签以及非类型模板参数很有用。使用多字符文字,可以将int直接输入到源代码中,这非常方便。


3
投票

-pedantic第2.13.3节,条目2:


0
投票

令人难以置信,我认识的每个编译器都将定义为4个字符的UINT的第一个字符放在低有效字节(小印度)---但是Visual C却是相反的方向🙄

© www.soinside.com 2019 - 2024. All rights reserved.