今天是否使用了有向图和三字母?

时间:2011-09-16 23:42:09

标签: c++ c digraphs trigraphs

鉴于有一些理由在C和C ++中使用digraphs and trigraphs,是否有人将它们放入今天编写的代码中?是否仍有大量遗留代码在维护中包含它们?

(注意:这里,“digraph”确实意味着“有向图”。digraphtrigraph都有多重含义,但这里的预期用途是类似的序列??=<:代表#[等字符

5 个答案:

答案 0 :(得分:26)

我不确定,但您最有可能发现IBM大型机环境中使用的有向图和三字符。 EBCDIC字符集不包含C所需的某些字符。

有向图和三字符的另一个理由,7位ASCII-ish字符集用重音字母替换一些标点字符,今天可能不那么重要。

在这样的环境之外,我怀疑三分法比错误更常使用,如:

puts("What happened??!");

作为参考,三元组在1989 ANSI C标准中引入(基本上成为1990 ISO C标准)。他们是:

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

替换发生在源代码中的任何位置,包括注释和字符串文字。

Digraphs是某些令牌的替代拼写,不会影响评论或文字:

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

1995年的ISO C标准修正案引入了有向图。

答案 1 :(得分:16)

有一个proposal pending for C++1z(C ++ 1y之后的下一个标准将被标准化为-hopefully- C ++ 14),旨在从标准中删除三字符。他们对未公开的大型代码库进行了案例研究:

  

案例研究

     

在一个大型代码库中使用类似三字母的结构   检查。我们发现:

     

923个逃脱的实例?在字符串文字中避免三字符   replacement:string pattern()const {return&#34; foo - ???? \? - of - ?????&#34 ;; }

     

在测试代码中故意使用了4个三字母实例:2个   用于编译器的测试套件,另外两个用于测试套件   boost的预处理器库。

     

0个三元组实例   故意用于生产代码。 Trigraphs继续构成一个   C ++用户的负担。

提案注意到(原提案大胆强调):

  

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

答案 2 :(得分:8)

答案 3 :(得分:5)

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

为什么它们存在,是因为C ++委员会从不发布会破坏遗留代码的变更。不论结果好坏。有一个轶事是他们的删除被提出并得到支持,并且被一位单独的IBM代表阻止了。

答案 4 :(得分:3)

我知道这是一个老问题,但是现在可以说是合法用途:没有实际键盘的触摸屏。例如,如果您通过平板电脑或类似的东西进行任何编码,那么典型的美国键盘布局不一定是完整形式的,由于它有多繁琐,因此很可能很少见(对于赋值算符,我的三次点击) 。我个人不会在可能的情况下使用它们,但是如果没有它们代表的实际代币,它们就很有用。

同样,我真的希望人们尽可能避免这种情况,但这是了解和使用它们的一个原因。