为了账号安全,请及时绑定邮箱和手机立即绑定

C+多字符文字

C+多字符文字

C++
森林海 2019-06-28 14:52:29
C+多字符文字我不知道C和C+允许multicharacter literal*不是“c”(类型)INT在C和焦耳在C+中),但“tralivali”(类型)INT!)enum{     ActionLeft = 'left',     ActionRight = 'right',     ActionForward = 'forward',     ActionBackward = 'backward'};标准说:C99 6.4.4.4p10:“包含多个字符(例如‘ab’)的整数字符常数的值,或包含不映射到单个字节执行字符的字符或转义序列的值,都是实现定义的。”我发现它们被广泛地应用于C4发动机..但我认为,当我们谈论平台无关的序列化时,它们是不安全的。这也可能令人困惑,因为看起来像字符串。那么,多字符文字的使用范围是什么,它们对某些东西有用吗?它们在C+中只是为了与C代码兼容吗?它们是否被认为是一个糟糕的特征后藤接线员还是不接线员?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

我不知道它的使用范围有多广,但是“实现定义”对我来说是一个很大的危险。据我所知,这可能意味着实现可以选择忽略您的字符指定,只要它愿意,只分配正常的增量值。它可能会做一些“更好”的事情,但您不能在编译器(甚至编译器版本)中依赖这种行为。至少“Goto”有可预见的(如果不受欢迎的)行为.

反正那是我的2c。

编辑:关于“执行-定义”:

从…Bjarne Stroustrup的C+词汇表:

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

还有.。

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

我相信这意味着评论是正确的:它至少应该编译,尽管没有具体说明。还请注意定义中的建议。


查看完整回答
反对 回复 2019-06-28
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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

例子:

enum state { waiting, running, stopped };

v.V.

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

以下语句之后的内存转储:

s = stopped;

看起来可能是:

00 00 00 02 . . . .

在第一种情况下,VS:

73 74 6F 70 s t o p

使用多字符文字。(当然,它是“停止”还是“POTS”取决于字节排序)


查看完整回答
反对 回复 2019-06-28
?
慕少森

TA贡献2019条经验 获得超9个赞

四个字,我见过也用过。它们映射到4个字节=一个32位字。如上所述,它对于调试非常有用。它们可以在带有INT的开关/CASE语句中使用,这很好。

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

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

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


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信