C++ C+中三角图序列的用途+;?

C++ C+中三角图序列的用途+;?,c++,c++03,trigraphs,C++,C++03,Trigraphs,根据C++'03标准2.3/1: 在进行任何其他处理之前,以下三个字符的序列(“trigraph序列”)中的每一个出现都会被表1中所示的单个字符替换 ---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------

根据C++'03标准2.3/1:

在进行任何其他处理之前,以下三个字符的序列(“trigraph序列”)中的每一个出现都会被表1中所示的单个字符替换

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------
----------------------------------------------------------------------------
|三角图|替换|三角图|替换|三角图|替换|
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------
在现实生活中,这意味着代码
printf(“什么??!\n”)将导致打印
什么|
,因为
是一个三角图序列,用
|
字符替换

我的问题是使用三角图的目的是什么?使用三角图有什么实际优势吗

UPD:在回答中提到,一些欧洲键盘没有所有标点符号,因此非美国程序员必须在日常生活中使用三角图


UPD2:Visual Studio 2010默认情况下关闭了trigraph支持。

它们用于缺少C++基本字符集中某些字符的系统。不用说,这种系统极为罕见。

< P> >代码> C++编程语言< /C>特别版,第829页< /P> ASCII特殊字符
[
]
{
}
\
占据ISO指定为字母的字符集位置。在大多数欧洲国家ISO-646字符集中,这些位置由英文字母表中找不到的字母占据

提供了一组三角图,以允许使用真正标准的最小字符集以可移植的方式表达国家字符。这对于程序的交换很有用,但并不能使人们更容易阅读程序。当然,这个问题的长期解决方案是C++程序员得到支持他们的母语和C++的设备。不幸的是,这对一些人来说似乎是不可行的,而引进新设备可能是一个令人沮丧的缓慢过程


一些欧洲键盘没有(没有?)像美国键盘那样拥有所有的标点符号,因为它们需要特殊字母字符的键。例如,瑞典键盘上的A形圈就是花括号所在的位置


为了适应这些用户,三角图是一种仅使用最常见的ASCII字符输入标点符号的方法。

三角图的出现主要是出于历史原因。如今,大多数语言的大多数现代键盘都允许访问所有这些字符,但这曾经是一些欧洲键盘的一个问题。这就是三角图被发明的原因

如果你不知道它们的用途,你就不应该使用它们

不过,意识到它们仍然很好,因为您可能会在代码中意外或无意地使用它们

有答案

归根结底,ISO 646字符集并没有C语法的所有字符,因此有些带有键盘和显示器的系统无法处理这些字符(尽管我认为现在这些字符非常罕见)

一般来说,您不需要使用它们,但是您需要确切地了解您遇到的问题。三角图是“
”字符具有转义序列的原因:

'\?'
因此,有几种方法可以避免示例问题:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 
但是你必须记住,当你输入两个“?”字符时,你可能会开始一个三角图(当然我从来没有想过这件事)

实际上,在日常生活中,我根本不担心三角图和有向图。但是你应该意识到它们,因为每隔几年你就会遇到一个与它们相关的bug(你会花一整天的时间诅咒它们的存在)。如果编译器可以配置为在遇到三元图或有向图时发出警告(或错误),这样我就可以知道我有什么事情需要处理

为了完整性,有向图的危险性要小得多,因为它们被当作标记处理,所以字符串文本中的有向图不会被解释为有向图

要了解C/C++程序中标点符号的各种乐趣(包括一个会让我毛骨悚然的trigraph bug),请参阅


增编:


默认情况下,GCC似乎不会处理(并警告)三角图。其他一些编译器有关闭trigraph支持的选项(例如IBM的)。Microsoft在VS2008中开始支持必须显式启用的警告(C4837)(使用-Wall或其他东西)。

主要是因为C标准早在1989年就引入了警告(C4837),当时在某些机器上存在trigraphs映射到的字符存在问题。在1998发布C++标准时,对三叉树的需求并不很大。它们是C上的一个疣;它们就像C++上的一个疣。对它们的需求——特别是在英语世界之外——这就是为什么它们被添加到C中的原因。

我看到在90年代早期使用Trigraph来帮助将大型机中的PL/1程序转换为在PC上运行/编译/调试

他们正在使用PL/I-to-C编译器在PC机上编辑PL/I,他们希望在移回不支持花括号的大型机时代码能够正常工作。我建议他们
#def BEGIN {    
#def END }  
#def BEGIN ??<
#def END ??>
#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif