U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 土豆PE使用教程 >

CC++:编译器偶然的bug-三联符序列

来源:http://www.tudoupe.com时间:2022-02-16

编译器偶然的bug-三联符序列(CC++)

其实在由三个字母组成的具有转义功能的一组符号

文章目录

  • 编译器偶然的bug-三联符序列(CC++)
    • 1. 三联符序列
    • 2. 存在的意义
    • 3. 以前的完美,现在的bug
    • 4. 常出现的几个三联符序列
    • 5. 并不是所有编译器都支持三联符序列
      • 5.1 win + vscode + MinGW环境:
      • 5.2 win + keil5 + c99环境:
      • 5.3 vc环境:
      • 5.4 linux + GNU的gcc环境:
      • 5.5 css10 + TI clang环境(TI推荐的开发环境之一):
      • 5.6 像阿里平头哥、沁恒mcu这种用于编译RISC-V内核的程序的编译器
    • 6. 总结:莫要轻易打 ?? 号

1. 三联符序列

  • 三联符序列其实就是由两个?号外加另外一个符号组成的三个符号的具有转义功能的一组符号。

  • 在ANSI标准,定义了 ??* 表示的一类字符,称为三联符序列。

  • C99 中它英文名为 “trigraph sequence”。

2. 存在的意义

早期有些设备不支持ASCII的字符集(现在你已经看不见不支持ASCII的字符集的设备了),比如某些七位代码集,那些字符集相比ASCII的字符集缺少一些字符, 为了使C程序能在这些非ASCII的字符集电脑上编写, 就必须想办法实现这些字符,用其它字符替代就是一种好办法,三联符序列就是c标准里面制订的一套符号替代的方案的标准。

3. 以前的完美,现在的bug

以前的一种看似比较好的解决方案,现在却成了一种极其偶然的bug,由于现在的各种教程都不讲这些东西,结果知道这些的人非常少,没有人会注意。而不一样的编译器对这个支持的也有不同,所以当跨平台移植的时候,可能会产生不一样的效果。而且三联符序列不管写在程序的哪里都会有效果,包括注释里,字符串里。于是三联符序列导致的bug就诞生了。

举例1:

这个printf函数不会输出,因为它被注释掉了。

‘??/’ 将被翻译为’ ',在c语言中反斜杠表示断行(编译的时候和下一行先连接一体在编译),所以从最开始的//连着printf一起注释掉了。这将是一个非常大的隐患,这表示有可能您写了一句非常重要的代码,结果不执行,而且编译不报警告也不报错。恐怖不!如果出现在一个大项目里,这将要使人崩溃。

举例2:

这个会被编译成功,因为’??=’ 将被翻译为’ # ‘, ‘??<’ 将被翻译为’ { ', 您感觉这是不可思议,但是 vc2008 编译成功了。而且这是正确的语法。

举例3:

这是我们经常会出现的错误:’??)’ 将被翻译为’ ] '. 上面这条语句输出变成:

乱码了?,不,其实这是正确的输出。

4. 常出现的几个三联符序列

三联符列表 被编译器当作的字符
??= #
??( [
??) ]
??< {
??> }
??/
??! |
??’ ^
??- ~

5. 并不是所有编译器都支持三联符序列

三联符序列支持与否,和编译器有关,不一样编译器对ANSI C 的支持情况也不一样(如GCC:我们称它采用了扩展的c标准,即增加了很多c标准里面没有的东西,同时也删了一些它认为c标准里面没有用的东西),编译器效果也不同,所以有些编译器可能会不处理三联符序列,将他视为字符串。

由于本人是做嵌入式开发,因此测试更加偏重嵌入式方向,下面是常见编译器下举例,其他环境当我用到会再次补充。

5.1 win + vscode + MinGW环境:

默认不支持三联符序列,使用三联符序列会当成字符串,同时会给出警告。

当在程序里面写有 ??/

编译报警告如下:

5.2 win + keil5 + c99环境:

支持,并且edit的变色,反而让您更难发现问题。有的时候出现三联符序列时编辑器会在前面显示一个红叉,但是编译不会报错也没有警告。

在这里插入图片描述

5.3 vc环境:

我听网上说vs2008是支持的,

5.4 linux + GNU的gcc环境:

还未来得及实验

5.5 css10 + TI clang环境(TI推荐的开发环境之一):

不支持三联符序列。
在这里插入图片描述

5.6 像阿里平头哥、沁恒mcu这种用于编译RISC-V内核的程序的编译器

不支持三联符序列,但这只是实验了两家产品,并不保证所有用于编译RISC-V内核的程序的编译器都如此。

6. 总结:莫要轻易打 ?? 号

由于不一样的编译器对三联符序列支持的不同,当代码需要跨平台,可能在您的电脑编译后运行正常,在他电脑环境下编译运行就会疯狂,所以最好的做法就是我们千万不要连续打出两个ASCII码 ? 号, 这样可以有效避免三联符序列导致的问题。

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息