C ++多字符文字
我不知道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')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的“。
我发现它们在C4引擎中被广泛使用。 但是在我们谈论平台独立序列化时,我想他们并不安全。 Thay也会因为看起来像字符串而感到困惑。 那么什么是多字符文字的使用范围,对某些东西有用吗? 他们在C ++只是为了与C代码兼容吗? 他们被认为是一个不好的功能,作为goto运算符或不?
我不知道这有多广泛,但“实现定义”对我来说是一个很大的红旗。 据我所知,这可能意味着实现可能会选择忽略你的角色名称,只是分配正常的递增值,如果它想要的。 它可能会做一些“更好的”,但不能在编译器(甚至是编译器版本)中依赖这种行为。 至少“goto”具有可预测的(如果不希望的)行为…
无论如何,这是我的2c。
编辑:在“实现定义”:
来自Bjarne Stroustrup的C ++术语表 :
实现定义 – C ++语义的一个方面,为每个实现定义,而不是在每个实现的标准中指定。 一个例子是一个int的大小(它必须至少有16位,但可以更长)。 尽可能避免实现定义的行为。 另见:未定义。 TC ++ PL C.2。
也…
未定义 – C ++的语义的一个方面,没有合理的行为是必需的。 一个例子是解引用一个零值的指针。 避免未定义的行为。 另见:定义的实现。 TC ++ PL C.2。
我相信这意味着这个评论是正确的:至少应该编译,尽管没有详细说明。 也请注意定义中的建议。
这使得更容易在内存转储中挑出值。
例:
enum state { waiting, running, stopped };
与
enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };
内存转储后的语句如下:
s = stopped;
可能看起来像:
00 00 00 02 . . . .
在第一种情况下,vs:
73 74 6F 70 stop
使用多字符文字。 (当然,不管是“stop”还是“pots”都取决于字节顺序)
四个字符文字,我见过和使用。 他们映射到4个字节=一个32位字。 如上所述,这对调试非常有用。 它们可以用ints在switch / case语句中使用,这很好。
这个(4个字符)是非常标准的(即至少由GCC和VC ++支持),尽管结果(编译的实际值)可能因实现而异。
但超过4个字符? 我不会用。
更新:从C4页面:“对于我们简单的操作,我们只是提供一些值的枚举,这是通过指定四个字符常量在C4中完成”。 所以他们正在使用4个字符文字,就像我的情况一样。
在C ++ 14规范草案N4527第2.13.3节中,条目2:
…包含多个c-char的普通字符文字是多字符文字。 多字符文字或包含单个c-char的普通字符文字在执行字符集中不可表示,是有条件支持的,具有int类型,并具有实现定义的值。
以前对您的问题的回答主要涉及支持多字符文字的真机。 具体而言,在int
为4字节的平台上,按照Ferrucio的mem转储示例,四字节多字符很好,可以方便使用。 但是,由于不能保证这种方式在其他平台上工作或工作方式相同, 因此对于便携式程序应该不要使用多字符文字 。
多字符文字允许通过等同的字符表示来指定int
值。 用于枚举,FourCC代码和标签,以及非类型的模板参数。 使用多字符文字,可以将FourCC代码直接输入到源代码中,这非常方便。
gcc中的实现在https://gcc.gnu.org/onlinedocs/cpp/Implementation-defined-behavior.html中有描述。; 请注意,该值被截断为int
类型的大小,所以'efgh' == 'abcdefgh'
如果您的整数是4个字符宽,但gcc会对溢出的文字发出警告。
不幸的是,如果传递了-pedantic
,gcc将对所有多字符文本发出警告,因为它们的行为是实现定义的。 正如你上面看到的,如果你切换实现,也许可能两个多字符文字的平等性发生改变。