【发布时间】:2021-01-27 13:04:26
【问题描述】:
我不知道 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'), 或包含字符或转义 不映射到 a 的序列 单字节执行字符,是 实现定义。”
我发现它们在C4 engine 中被广泛使用。但是当我们谈论平台无关的序列化时,我认为它们并不安全。 Thay 也可能令人困惑,因为它看起来像字符串。那么多字符文字的使用范围是什么,它们对某些东西有用吗?它们在 C++ 中只是为了与 C 代码兼容吗?作为 goto 运算符,它们是否被认为是一个不好的功能?
【问题讨论】:
-
goto不是一个坏功能;至少在 C 中。它比多字符文字有用得多。 -
Apple 过去使用它们来识别开发者和应用程序名称。基本上,它们是代表您的开发者 ID 的视觉方式。
int id='MYCP';Apple 会将您的开发者 ID 作为字符文字告诉您,而不仅仅是一个无聊的旧 int。 -
在boost::mpl::string 序列中使用(滥用?)多字符文字,如果你喜欢这种事情的话。
-
我们使用多字符文字来快速填充字符串。要使用“1234”填充字符串,我们使用 *(int*)sz = '4321'。 memcpy(sz, "1234", 4) 有时会针对 *(int*)sz = '4321' 产生的相同程序集进行优化。优化器并不总是这样做,所以我们使用多字符文字强制它..
-
在 C++ 中,多字符文字是有条件支持的。因此您的代码可能无法编译。如果它们受支持,则它们具有 实现定义 值。因此,实现可能会选择为所有多字符文字分配值
0,从而破坏您的代码。