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

rwa*_*ace 39 c c++ digraphs trigraphs

鉴于曾经有过在C和C++中使用有向图和三字符的理由,是否有人将它们放入今天编写的代码中?是否还有大量遗留代码仍在维护中并包含它们?

(注:这里的"有向图"并不会意味着"有向图".这两个有向图三字母有多种含义,但这里的用途是一样的序列??=<:站在像字符#[)

Kei*_*son 26

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

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

在这样的环境之外,我怀疑三元组错误比故意更常用,如:

puts("What happened??!");
Run Code Online (Sandbox Code Playgroud)

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

??= #     ??) ]     ??! |
??( [     ??' ^     ??> }
??/ \     ??< {     ??- ~
Run Code Online (Sandbox Code Playgroud)

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

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

<: [      :>   ]
<% {      %>   }
%: #      %:%: ##
Run Code Online (Sandbox Code Playgroud)

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

  • 在这种情况下,写`puts("发生了什么?""?!\n");`来获得正确的输出. (2认同)
  • @Gzorg也可以通过逃避第二个"?"来规避三角形.因此:`puts("发生了什么?\?!\n");` (2认同)

Tem*_*Rex 16

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

案例分析

检查了三个类似构造在一个大型代码库中的用法.我们发现:

923个逃脱的实例?在字符串文字中避免三字母替换:string pattern()const {return"foo - ???? \? - of - ?????"; }

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

在生产代码中故意使用了0个三字符实例.Trigraphs继续给C++用户带来负担.

该提案指出(原始提案大胆强调):

从物理源文件字符的实现定义映射到基本源字符集可以包括三字符翻译(甚至可以避免左右的时间内这样做的:如果三字母从完全的语言,是希望支持他们能继续这样做的实现去除原始字符串文字).我们不需要标准中的三字符来实现向后兼容性.

  • 但那么所有逃脱的三角形会发生什么? (3认同)

Sim*_*mon 8

它们可用于国际混淆C代码竞赛.

  • @undur_gongor足够公平.但我想这是对一个差不多3年之久的问题的答案,这个问题已被17个以上的投票回答,这是相当学术性的. (3认同)

Ann*_*inn 5

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

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

  • 为什么它是*链接器*选项?Trigraph由编译器处理; 链接器甚至不需要知道它们. (2认同)