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'取决于字节顺序)
Nic*_*ick 18
我不知道这有多广泛,但"实现定义"对我来说是一个大红旗.据我所知,这可能意味着实现可以选择忽略您的角色指定,只是根据需要分配正常的递增值.它可能会做一些"更好"的事情,但你不能依赖编译器(甚至编译器版本)的那种行为.至少"goto"具有可预测的(如果不合需要的)行为......
无论如何,这是我的2c.
编辑:关于"实现定义":
实现定义 - C++语义的一个方面,它是为每个实现定义的,而不是在每个实现的标准中指定的.一个例子是int的大小(必须至少为16位但可以更长).尽可能避免实现定义的行为.另见:undefined.TC++ PL C.2.
也...
undefined - C++语义的一个方面,不需要合理的行为.一个示例是取消引用值为零的指针.避免未定义的行为.另请参见:实现定义.TC++ PL C.2.
我相信这意味着评论是正确的:它至少应该编译,尽管没有指定任何东西.另请注意定义中的建议.
我见过并使用过的四个字符文字.它们映射到4个字节=一个32位字.如上所述,它对于调试目的非常有用.它们可以在带有整数的switch/case语句中使用,这很不错.
这(4个字符)是非常标准的(即至少由GCC和VC++支持),尽管结果(编译的实际值)可能因实现而异.
但超过4个字符?我不会用.
更新:从C4页面:"对于我们的简单操作,我们只提供一些值的枚举,这是通过指定四个字符常量在C4中完成的".所以他们使用4个字符文字,就像我的情况一样.