Trigraph Sequences In C Language
trigraph sequences In C Language
tirgraph sequences其实就是用特殊的三字符序列来表示某个字符,在C语言诞生的早期有的键盘(非英语国家)是没有中括号,大括号等字符输入功能的,但这些字符都是构成C语言语法必不可少的,为了解决这个问题,C标准就规定了若干三字符序列来表示这些不能录入的字符
trigraph sequences有哪些?
Trigraph Represent
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~
值得注意的是??/
,如果行尾有它作用是对换行符进行转义
trigraph sequences替换是如何发生的?
tirgraph sequences发生在预处理阶段的第一步,凡是遇到符合trigraph sequences的字符序列就进行替换,这通常是没有任何问题的,但如果程序出现的trigraph sequences是无意造成的(也就是说程序员原来以为的普通的字符串却符合了tirgraph语法),这样的替换就是bug,例如: printf("What??!");
,若该代码本意是输出What??!
,但是经过trigraph替换后输出的却是What|
,发生意外替换可能的位置有:
1. multi-charcter constants,例如: `unsigned int c = 'B??!';`
2. string literals,例如: `printf("hello??!");`
3. comments,例如: `/* What??! */`
那么如何避免错误的替换呢?可以通过在第一个问号与第二个问号之间插入转义符\
避免替换发生,还可以这样printf("What?""?!");
(注:字符串连接并不发生在预处理阶段)
digraph sequences是什么?
在C99标准中为上面的某些trigraph sequences提供了简化版,即使用两个字符来表示特殊字符
Digraph Represent
<: [
:> ]
<% {
%> }
%: #
**注:**digraph的替换虽然也发生在预处理阶段,但其发生于tirgraph替换之后的tokenization阶段,同时处于引号中中的digraph并不会被替换
C++增添了什么?
Token Represent
%:%: ##
and &&
bitor |
or ||
xor ^
compl ~
bitand &
and_eq &=
or_eq &=
xor_eq ^=
not !
not_eq !=
C++增加的替换同样是发生在预处理的tokenization阶段(详见)