C++多字符文字

top*_*dev 40 c c++ syntax literals

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

enum
{
    ActionLeft = 'left',
    ActionRight = 'right',
    ActionForward = 'forward',
    ActionBackward = 'backward'
};
Run Code Online (Sandbox Code Playgroud)

标准说:

C99 6.4.4.4p10:"包含多个字符(例如,'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的".

我发现它们广泛用于C4发动机.但是,当我们谈论平台独立序列化时,我认为它们并不安全.Thay也会让人感到困惑,因为看起来像字符串.那么什么是多字符文字的使用范围,它们对某些东西有用吗?他们是否只是为了与C代码兼容而使用C++?它们被认为是goto运算符的坏特征吗?

Fer*_*cio 29

它可以更容易地选择内存转储中的值.

例:

enum state { waiting, running, stopped };
Run Code Online (Sandbox Code Playgroud)

enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };
Run Code Online (Sandbox Code Playgroud)

以下语句后的内存转储:

s = stopped;
Run Code Online (Sandbox Code Playgroud)

可能看起来像:

00 00 00 02 . . . .
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,vs:

73 74 6F 70 s t o p
Run Code Online (Sandbox Code Playgroud)

使用多字符文字.(当然是否说'stop'或'pots'取决于字节顺序)

  • 好的例子? (5认同)
  • 好吧,我在Cray机器上听说过,"`sizeof(char)== sizeof(int)`"是真的.我完全不知道C编译器可能对其中一个的多字符文字做什么... (2认同)
  • 根据Cray C&C++参考手册(http://docs.cray.com/books/S-2179-52/html-S-2179-52/zfixedfqsizyiy.html#ZFIXED9ILWPOX2),多字符文字的工作方式相同( 8位/ char,即使char类型本身更大). (2认同)

Nic*_*ick 18

我不知道这有多广泛,但"实现定义"对我来说是一个大红旗.据我所知,这可能意味着实现可以选择忽略您的角色指定,只是根据需要分配正常的递增值.它可能会做一些"更好"的事情,但你不能依赖编译器(甚至编译器版本)的那种行为.至少"goto"具有可预测的(如果不合需要的)行为......

无论如何,这是我的2c.

编辑:关于"实现定义":

来自Bjarne Stroustrup的C++词汇表:

实现定义 - C++语义的一个方面,它是为每个实现定义的,而不是在每个实现的标准中指定的.一个例子是int的大小(必须至少为16位但可以更长).尽可能避免实现定义的行为.另见:undefined.TC++ PL C.2.

也...

undefined - C++语义的一个方面,不需要合理的行为.一个示例是取消引用值为零的指针.避免未定义的行为.另请参见:实现定义.TC++ PL C.2.

我相信这意味着评论是正确的:它至少应该编译,尽管没有指定任何东西.另请注意定义中的建议.

  • 这里对"未定义行为"的引用是无关紧要的."实现定义"和"未定义"是两个不同的术语,具有两种不同的含义.我不认为多字符文字属于[鼻子恶魔](http://catb.org/jargon/html/N/nasal-demons.html)类别.我认为@Ferruccio是正确的:您可以使用该功能,只要您不关心如何在引擎盖下实现该功能. (6认同)
  • 据我所知,不允许编译失败 (3认同)
  • 我完全同意红旗.我的兴趣主要是理论上的. (3认同)

jv4*_*v42 5

我见过并使用过的四个字符文字.它们映射到4个字节=一个32位字.如上所述,它对于调试目的非常有用.它们可以在带有整数的switch/case语句中使用,这很不错.

这(4个字符)是非常标准的(即至少由GCC和VC++支持),尽管结果(编译的实际值)可能因实现而异.

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

更新:从C4页面:"对于我们的简单操作,我们只提供一些值的枚举,这是通过指定四个字符常量在C4中完成的".所以他们使用4个字符文字,就像我的情况一样.