更新 -这个答案虽然对我和其他人来说似乎都有意义,但事实证明它在很大程度上是错误的(在意图上是完全错误的,实际上是完全错误的)。由于(在由AProgrammer评论如指出的)它不容许使用字符串常量的UCS外时相同的字符能够正常在基座字符集表示。因此,不像我的示例那样使用它来转义关键字。并且不像23skiddo
通过转义来使用它来使“标识符”2
。我猜,它仍然可以用来使名称与外部语言兼容,但是,仅当这些名称以字母或扩展字符开头,并且仅包含字母,数字,下划线和扩展字符时,它们才可以使用。似乎过于严格以至于无法正确支持这一意图。因此,主要目的是(如在AProgrammer的回答中那样)允许标识符中包含这些额外的字符,并允许源编辑器以图形方式显示这些字符,同时仍允许源文件为纯ASCII。
C ++程序可以调用以其他语言编写的函数。标准化委员会的一个好策略是确保C ++与其他语言互操作,即使这些语言尚不存在,它们也可以在函数名称中使用非字母数字或Unicode字符。该标准不需要指定它在链接器级别如何工作,等等。但是最好有一个指定的机制来允许它。
您无需展望未来即可看到此用途。假设我有一个旧的C库,其中包含一个称为catch
(或受保护的或可变的)函数...我想从C ++中调用它。出于某种原因,我无法或不想修改C代码(顺便说一句,我不只一次要处理使用功能名称已成为C ++关键字的旧C代码...)
使用UC名称,我可以将其写在标题中,然后仅调用'catch_func()':
extern "C" {
int catc\u0068( int a, int b ); // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }
当然这很丑陋,但这并不重要,因为它仅位于标头中的一个位置。可以使用相同的方法来使存根(stub)来调用其他语言的函数,即使名称是C ++关键字或unicode,或者.
在其中嵌入空格或其他标点符号,该方法也可以使用
其他各种语言都有允许创建不遵循一般模式的标识符的设备;例如,在Verilog中,\abcd
是与等效的标识符abcd
,但\while
和\23skidoo
和\44.e2
也是标识符,需要反斜杠前缀才能这样看。由于使用Verilog的方式,很重要的一点是,在与外部接口相关的所有名称都必须全部允许。