现在有二字三字母在使用吗?

鉴于有一次在C和C ++中使用二元字母和三字母的理由, 有没有人把它们写入今天的代码? 是否有任何大量的遗留代码仍在维护中,包含它们?

(注意:这里“digraph”并不意味着“有向图” .durraph和trigraph都有多重含义,但是这里的意图是使用??=或者<:来代替#[

C ++ 1z (C ++ 1y之后的下一个标准将被标准化为C ++ 14)将有一个提案 ,目标是从标准中删除三元组。 他们对另一个未公开的大型代码库进行了案例研究:

案例分析

检查了一个大型代码库中trigraph-like构造的用法。 我们发现:

923个逃脱的实例? 在一个string文字,以避免三字母replace:string pattern()const {return“foo – ?????? – of?”; }

在testing代​​码中有意使用了3个trigraphs实例:testing套件中有两个用于编译器,另外两个用于boost预处理器库的testing套件。

在生产代码中有意使用了三个trigraph的实例。 三字母继续对C ++用户造成负担。

提案注(原提案中大胆强调):

如果trigraphs完全从语言中删除,那么希望支持它们的实现可以继续这样做:它从物理源文件字符到基本源字符集的实现定义映射可以包括三字符转换(并且甚至可以避免在原始string文字)。 在向后兼容的标准中,我们不需要三字母符号

我不确定,但是你最有可能在IBM大型机环境中使用二元图和三元图。 EBCDIC字符集不包括C所需的一些字符

另一个用于二叉字母和三字母的理由是7位ASCII-ish字符集,它们用一些重音字母代替了一些标点符号,这在今天可能不那么重要。

在这样的环境之外,我怀疑三字母比错误地使用更为常见,比如:

 puts("What happened??!"); 

作为参考,trigraphs是在1989年的ANSI C标准中引入的(基本上成为了1990年的ISO C标准)。 他们是:

 ??= # ??) ] ??! | ??( [ ??' ^ ??> } ??/ \ ??< { ??- ~ 

replace发生在源代码中的任何地方,包括注释和string文字。

有向图是某些令牌的替代拼写,不影响注释或文字:

 <: [ :> ] <% { %> } %: # %:%: ## 

有向图是1995年对1990年ISO C标准的修改引入的。

他们可以用于国际混淆的C代码大赛 。

三和二图的使用不是在这一天写的,它只存在于非常有限的环境中创build的非常旧的代码。 任何包含trigraph的代码,如果你试图在像VS这样的现代编译器上编译它们,除非你指定了一个链接器选项,否则它通常不会编译。 我知道的Visual Studio,该选项是“/ Zc:trigraphs”

为什么它们存在,是因为C ++委员会从来不会发布会破坏遗留代码的更改。 不pipe是好是坏。 有一个轶事,他们的搬迁是提出和支持,并被一个单独的IBM代表停下来。

我知道这是一个古老的问题,但现在有一个合理的用法:触摸屏没有真正的键盘。 例如,如果您通过平板电脑等进行任何编码,则典型的美式键盘布局不一定完全可用,但由于其可能有多么繁琐,所以希望很less见(我的三次点击操作符) 。 如果可能的话,我个人不会使用它们,但是它们在没有实际的令牌时很有用。

再次,我真的希望人们尽可能地避免这种情况,但这是知道和使用它的一个原因。