我不知道C和C++允许multicharacter literal:不是C(C中的int类型和C++中的char),而是"TrayalVi"(类型int)!

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

标准说:

c99 6.4.4.4p10:"一个 包含以下内容的整数字符常量 多于一个字符(例如,‘ab’), 或包含字符或转义 序列,该序列不映射到 单字节执行字符,为 实现定义的."

我发现它们在C4 engine个国家被广泛使用.但我认为,当我们谈论独立于平台的序列化时,它们并不安全.它们可能会让人困惑,因为它们看起来像字符串.那么多字符文字的使用范围是什么,它们对什么有用吗?它们是C++中的与C代码兼容的吗?作为goto操作员,它们是否被认为是一个不好的特性?

推荐答案

我不知道它的使用范围有多广,但是"实现定义的"对我来说是一个很大的危险信号.据我所知,这可能意味着实现可以 Select 忽略您的字符指定,如果需要,只分配正常的递增值.它可能会做一些"更好"的事情,但是您不能依赖于跨编译器(甚至编译器版本)的行为.至少"Goto"有可预测的(如果不受欢迎的)行为...

反正那是我的2c.

编辑:关于"定义的实现":

Bjarne Stroustrup's C++ Glossary:

implementation defined-C++语义的一个方面,它是 for each 实现定义的,而不是在标准中 for each 实现指定的.例如int的大小(必须至少为16位,但可以更长).尽可能避免实现定义的行为.另请参阅:未定义.TC++PL C.2.

而且

undefined-不需要合理行为的C++语义的一个方面.例如,取消引用值为零的指针.避免未定义的行为.另请参阅:定义的实现.TC++PL C.2.

我相信这意味着注释是正确的:它至少应该进行编译,尽管没有指定超出这个范围的内容.也请注意定义中的建议.

C++相关问答推荐

C/C++中的状态库

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

核心转储文件中出现奇怪的大小变化

#If指令中未定义宏?

LONG_DOUBLE_T是否存在(标准C:C23)

在我的代码中,我需要在哪里编写输出函数?

防止规范模式在C++中 echo 特殊字符

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

GCC错误,共享内存未定义引用?

如何在VSCode中创建和使用我自己的C库?

为什么我的二叉树删除删除整个左部分的树?

发送和接收的消息中的Unix域套接字不匹配

如何使用WRITE()以指针地址的十六进制形式写入标准输出

macos/arm64 上地址空间不使用第一位吗?

为什么写入关闭管道会返回成功

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

C语言程序流程解释

仅使用其内存地址取消引用 C 中的 struct

从 COBOL 调用外部 C 库