为什么多字符文字存在于C和C++中?

zsohkypk  于 2023-10-16  发布在  其他
关注(0)|答案(5)|浏览(85)

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

enum
{
    ActionLeft = 'left',
    ActionRight = 'right',
    ActionForward = 'forward',
    ActionBackward = 'backward'
};

标准说:
C99 6.4.4.4p10:如果整数字符常量包含多个字符(例如,“ab”),或者包含未Map到单字节执行字符的字符或转义序列,则其值由实现定义。
我发现它们在C4 engine中被广泛使用。但我认为当我们谈论平台无关的序列化时,它们是不安全的。他们也可以混淆,因为看起来像字符串。那么多字符文字的使用范围是什么,它们有什么用处吗?它们在C++中只是为了与C代码兼容吗?作为 * 后藤 * 操作符,它们是否被认为是一个不好的特性?

0tdrvxhp

0tdrvxhp1#

这使得在内存转储中挑选值变得更容易。
范例:

enum state { waiting, running, stopped };

vs.

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

在下面的语句之后的内存转储:

s = stopped;

可能看起来像:

00 00 00 02 . . . .

在第一种情况下,vs:

73 74 6F 70 s t o p

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

mfuanj7w

mfuanj7w2#

我不知道这有多广泛,但“实现定义”对我来说是一个大红旗。据我所知,这可能意味着实现可以选择忽略你的角色指定,如果需要的话,只分配正常的递增值。它可能会做一些“更好”的事情,但你不能依赖于跨编译器(甚至编译器版本)的行为。至少“后藤”有可预测的(如果不受欢迎的话)行为.
这是我的2C,无论如何。
编辑:关于“实现定义”:
Bjarne Stroustrup的C++词汇表:

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

还有...

undefined-C语义的一个方面,不需要合理的行为。一个例子是解引用一个值为零的指针。避免未定义的行为。参见:定义的实现。TCPL C.2.

我认为这意味着评论是正确的:它至少应该编译,尽管没有指定任何超出此范围的内容。也请注意定义中的建议。

oxosxuxt

oxosxuxt3#

四个字符的字面量,我见过并使用过。它们Map到4个字节=一个32位字。如上所述,它对调试非常有用。它们可以在switch/case语句中与int一起使用,这很好。
这(4个字符)是相当标准的(即至少由GCC和VC++支持),尽管结果(编译的实际值)可能会因实现而异。
但是超过4个字符?我不会用的。
更新:从C4页面:对于我们的简单操作,我们只提供一些值的枚举,这在C4中通过指定四个字符的常量来完成。所以他们使用4个字符的文字,就像我的情况一样。

f2uvfpb9

f2uvfpb94#

多字符字面量允许通过字符的等效表示来指定int值。用于枚举、FourCC代码和标记以及非类型模板参数。使用多字符文本,可以直接在源代码中输入FourCC code,这很方便。
gcc中的实现在https://gcc.gnu.org/onlinedocs/cpp/Implementation-defined-behavior.html中描述。请注意,该值被截断为int类型的大小,因此如果int为4个字符宽,则为'efgh' == 'abcdefgh',尽管gcc会对溢出的文字发出警告。
不幸的是,如果-pedantic被传递,gcc将对 all 多字符文本发出警告,因为它们的行为是实现定义的。正如你在上面看到的,如果你切换实现,两个多字符文本的相等性可能会改变。

46qrfjad

46qrfjad5#

C++14 specification draft N4527第2.13.3节第2项中:
.一个普通的字符字面量包含一个以上的c-char是一个多字符字面量。一个多字符文字,或一个普通的字符文字,包含一个在执行字符集中不可表示的c-char,是有条件支持的,具有int类型,并具有一个实现定义的值。
以前对您的问题的回答大多涉及支持多字符文字的真实的机器。具体来说,在int是4字节的平台上,4字节多字符是可以的,可以方便地使用,就像Ferrucio的dump示例一样。但是,由于不能保证这将在其他平台上工作或以同样的方式工作,对于可移植程序,应该反对使用多字符文字

相关问题