`
provista
  • 浏览: 122130 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C/C++中的trigraph

阅读更多
C/C++ 为了照顾老一辈无产阶级革命家,他们的条件极其艰苦,键盘上缺了很多键,
无法输入下面九个字符:

    # \ ^ [ ] { } | ~

因此推出了 trigraph,
简单的讲就是把上面的每个字符用其他三个字符来代替,
替换的规则如下:

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


比如说,下面这个 C++ 程序:

#include <iostream>

int main() {
  std::cout << "[]" << std::endl;
}

可以改写成这样:

??=include <iostream>

int main() ??<
  std::cout << "??(??)" << std::endl;
??>

将 trigraph 替换成对应的字符发生在预处理之前,
因此 trigraph 可以在源码中的任何位置都可以用,
包括字符串内,函数体开头,预处理指令等。

有人说,如果那我就是用一个字符串常量,其中包含了 "??=" 怎么办?
比如说就是要打印两个问号接一个等号,怎么办?
很简单,把它拆开写, 为了打印出 "??=",我们把它拆成 "??" "=" 即可,
因为 C/C++ 在处理字符串字面值的时候,会把相邻的多个字符串字面值合并成一个,
而这个合并操作发生在 trigraph 替换之后,
下面的程序就可以正确的打印出两个问号和一个等号:

#include <iostream>

int main() {
  std::cout << "??" "=" << std::endl;
}


实测中,
VC 8 不给任何提示将 trigraph 替换成对应字符,
GCC 4.0.3 则要求加上编译参数 -trigraphs 才会做相应转换。

虽然 GCC 的做法是不符合标准的,但是更加安全。
更详细的情况可以参考标准 2.3。
分享到:
评论

相关推荐

    [c++] ANSI c++ Standard

    - **2.3 Trigraph sequences**:解释了源代码中的三字符序列。 - **2.4 Preprocessing tokens**:描述了预处理令牌的定义和使用。 - **2.5 Alternative**:这部分内容在提供的文档片段中被截断,可能是关于预处理器...

    Preprocessing CC++ Code in CDT

    ### 预处理C/C++代码在CDT中的实现与应用 #### 摘要 在本文档中,我们将深入探讨CDT(C Development Toolkit)5.0版本中引入的一个新工具,该工具用于探索宏扩展。为了支持此工具,预处理器进行了大幅度重写,并被...

    C++ International StandardC++ 国际标准

    这里列举了编写本标准时所依据的其他规范或标准文档,例如ISO/IEC 9899:1999(C语言国际标准)等,这些文档对于理解C++标准具有重要参考价值。 ##### 1.3 定义 此部分给出了C++标准中的关键术语和概念的定义,如...

    C++中Digraphs、Trigraphs和Tokens的深入讲解

    之前也是偶然间了解到C++的 Digraph(双字符组) ,但是当时没有进行扩展了解,没想到C++还有 Trigraph(三字符组) …,这个概念其实也很简单,维基百科的词条 三字符组与双字符组 写的也很清楚,就直接搬运过来一下。...

    C++ 程序员编程标准

    根据给定文件的部分内容,我们可以总结出C++程序员编程标准中的关键知识点,这些知识点主要涵盖了C++语言的基础概念、语法规范以及程序结构等方面。 ### 一、总览 #### 1.1 范围(Scope) - **定义**:范围指的是...

    C++ 标准 ISO 14882-2011

    - 字符集(Character sets)和转义序列(Trigraph sequences)介绍了C++代码中使用的字符集以及如何使用三字符序列。 - 预处理符号(Preprocessing tokens)、替代符号(Alternative tokens)、标识符...

    ISO/IEC 14882:1988(E) c++标准

    描述了C++程序中的内存布局和访问方式,包括对象生命周期管理等内容。 #### 7. 对象模型 **1.8 C++对象模型** 详细阐述了C++中对象的创建、销毁、存储方式及访问控制机制。 #### 8. 程序执行 **1.9 程序执行** ...

    LED灯闪烁实验

    这是一款由Keil Software公司开发的嵌入式系统开发工具,支持多种微控制器的C/C++编程,提供代码编辑、编译、调试等一体化服务。在实验中,我们需要配置项目、编写源代码,并利用其内置的编译器和仿真器进行程序的...

    绿色版PocketDOS 和 绿色版TC3.0

    CPASDEMO C - C example module for the Turbo Pascal - Turbo C++ interface demonstration CPASDEMO PAS - Pascal program that demonstrates Turbo Pascal - Turbo C++ interface CTOPAS CFG - Config file ...

    一线研发之声之C代码注释引发的“血案”

    /` 被视为C语言中的三字母词(trigraph),导致`a = b+c;` 被忽略。虽然现代编译器可能默认不支持trigraphs,但旧版本或特定配置下的编译器可能会出现问题。此外,`//` 是C++引入的,某些早期的C编译器可能不支持,...

    GCC 参数中文指导

    - **-ansi**:启用ANSI C兼容模式,禁用部分GCC特有的扩展,如`asm`, `inline`, `typeof`关键字和某些预定义宏,同时启用ANSI trigraph特性。 ##### 其他选项 - **-pipe**:使用管道代替临时文件在编译过程的不同...

Global site tag (gtag.js) - Google Analytics