C+多字符文字

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代码兼容吗?它们是否被认为是一个糟糕的特征后藤接线员还是不接线员?


森林海
浏览 402回答 3
3回答

慕慕森

我不知道它的使用范围有多广,但是“实现定义”对我来说是一个很大的危险。据我所知,这可能意味着实现可以选择忽略您的字符指定,只要它愿意,只分配正常的增量值。它可能会做一些“更好”的事情,但您不能在编译器(甚至编译器版本)中依赖这种行为。至少“Goto”有可预见的(如果不受欢迎的)行为.反正那是我的2c。编辑:关于“执行-定义”:从…Bjarne Stroustrup的C+词汇表:定义的实现-C+语义的一个方面是为每个实现定义的,而不是在标准中为每个实现指定的。一个例子是int的大小(必须至少为16位,但可以更长)。尽可能避免实现定义的行为。另请参见:未定义的。TC+PL C.2。还有.。未定义-C+语义的一个方面不需要合理的行为。一个例子是取消引用值为零的指针。避免未定义的行为。另见:实现定义。TC+PL C.2。我相信这意味着评论是正确的:它至少应该编译,尽管没有具体说明。还请注意定义中的建议。

凤凰求蛊

它使在内存转储中选择值变得更容易。例子: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”取决于字节排序)

慕少森

四个字,我见过也用过。它们映射到4个字节=一个32位字。如上所述,它对于调试非常有用。它们可以在带有INT的开关/CASE语句中使用,这很好。这(4个字符)是相当标准的(至少由GCC和VC+支持),尽管结果(实际值编译)可能因实现而异。但超过4个字符?我不会用。更新:从C4页面:“对于我们的简单操作,我们将提供一些值的枚举,这是在C4中通过指定四个字符常量完成的”。因此,他们使用4个字符文字,就像我的情况一样。
打开App,查看更多内容
随时随地看视频慕课网APP