C ++标识符中通用字符名称的用途是什么


11

C ++标准(我在新的标准中注意到了,但是C ++ 03中已经存在)指定通用字符名称,用Unicode代码点/ 表示为\uNNNN\UNNNNNNNN并表示这些字符。这对于字符串文字很有用,尤其是因为还明确定义了UTF-8,UTF-16和UCS-4字符串文字。但是,标识符中也允许使用通用字符文字。其背后的动机是什么?NNNNNNNNNNNN

语法显然是完全不可读的,链接器的标识符可能经过修饰,而且好像没有任何标准函数可以按名称检索符号一样。那么,为什么有人实际使用带有通用字符文字的标识符呢?

编辑:由于它实际上已经存在于C ++ 03中,因此另一个问题是您是否实际看到了使用它的代码?

Answers:


6

更新 -这个答案虽然对我和其他人来说似乎都有意义,但事实证明它在很大程度上是错误的(在意图上是完全错误的,实际上是完全错误的)。由于(在由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的方式,很重要的一点是,在与外部接口相关的所有名称都必须全部允许。


有趣的用例。尽管我怀疑(如果可能),最好编写一个小的C文件来转换名称(从而可以使用C ++标识符),并让C ++调用该C函数。
Thomas Eding 2014年

1
您不能这样写,有两个原因,第一,字符串外的UCS和字符文字不能在不使程序变形的情况下引用基本集中的字符,第二,如果该子句不存在,则UCS在转换的第一阶段中处理;因此,引用基本集中的字符的UCS与字符本身之间的处理不会有差异。
AProgrammer

4

它允许系统允许标识符中的unicode字符以可在任何符合标准的编译器上编译的格式导出源。IE是一种在基本字符集上对unicode进行编码的方法(或多或少地像电子邮件中使用了quoted-printable一样,知道得更好的系统可以做得更好,其他系统仍在工作)。


2

有人可能想使用键盘或输入设备上无法输入的外语字符来创建标识符。替代地,标识符可以包含使用设备的字体或输出功能不可打印的字符,但IDE希望显示准确的表示形式。


4
在第一种情况下,标识符看起来不像具有该字符,因此代码将无法读取,并且标识符对计算机实际上并不重要。第二,IDE中的表示是一个完全独立的问题。
Jan Hudec 2012年

1

C ++要求实际出现在源代码中的实际扩展字符的行为与通用字符名称相同。允许在标识符中使用通用字符名称允许程序员在标识符中使用扩展字符。


它支持实际的扩展字符,它们必须表现为相应的通用字符。但是他们不必得到支持。
Jan Hudec

1
没错,但这有点错了,那就是如果委员会要指定支持扩展字符的实现应支持在标识符中使用这些字符,那么这就要求在标识符中允许UCN。即标识符中允许使用UCN,这不一定是因为它是如此易读,并且每个人都喜欢以十六进制手动编码名称,而是因为如果规范要允许在标识符中使用扩展字符,则可以通过指定允许标识符中使用UCN来实现。
bames53 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.