鉴于有一些理由在C和C ++中使用digraphs and trigraphs,是否有人将它们放入今天编写的代码中?是否仍有大量遗留代码在维护中包含它们?
(注意:这里,“digraph”确实不意味着“有向图”。digraph和trigraph都有多重含义,但这里的预期用途是类似的序列??=
或<:
代表#
和[
等字符
答案 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)
我知道这是一个老问题,但是现在可以说是合法用途:没有实际键盘的触摸屏。例如,如果您通过平板电脑或类似的东西进行任何编码,那么典型的美国键盘布局不一定是完整形式的,由于它有多繁琐,因此很可能很少见(对于赋值算符,我的三次点击) 。我个人不会在可能的情况下使用它们,但是如果没有它们代表的实际代币,它们就很有用。
同样,我真的希望人们尽可能避免这种情况,但这是了解和使用它们的一个原因。