代用记号 (Alternative Tokens)
什么是代用记号?
代用记号是 C 语言标准中定义的一系列运算符的替代拼写形式。它们主要是为了解决早期或某些非标准的键盘和字符集(如 ISO 646 标准的某些版本)缺少 C 语言所需的一些关键符号(如 {, }, [, ], #, ^, |, ~)的问题而引入的。这些记号使得程序员可以在某些受限的环境下编写功能完全相同的 C 语言代码。
在代码中,它们与其对应的符号是完全等价的,编译器会将它们预处理或解析为对应的符号。
代用记号列表
代用记号主要分为两种:双字母组 (Digraphs) 和 三字母组 (Trigraphs)。
1. 双字母组 (Digraphs)
这些是两个字符的组合,用来替代单个标点符号。
| 双字母组 | 替代的符号 | 符号名称 |
|---|---|---|
<% | { | 左花括号 |
%> | } | 右花括号 |
<: | [ | 左方括号 |
:> | ] | 右方括号 |
%: | # | 井号 (预处理符号) |
%:%: | ## | 双井号 (预处理中的标记连接) |
示例: 使用双字母组的代码看起来是这样的:
c
// 原始代码
int main() {
int arr[5] = {1, 2, 3, 4, 5};
return 0;
}
// 使用双字母组的等价代码
int main() <%
int arr<:5:> = <% 1, 2, 3, 4, 5 %>;
return 0;
%>1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
2. 已被移除的三字母组
除了上述的代用记号,C 语言早期还有一个三字母组 (Trigraphs) 的概念,它们是三个字符的序列,以两个问号 ?? 开头。它们在 C17 标准中被弃用 (deprecated),并在 C23 标准中被正式移除。现代编程中应避免使用,也无需了解。
| 三字母组 | 替代的符号 |
|---|---|
??= | # |
??( | [ |
??) | ] |
??/ | \ |
??' | ^ |
??< | { |
??> | } |
??! | | |
??- | ~ |
现代代码中的定位
在现代工具链与键盘环境下,代用记号很少成为必需选项。大多数项目直接使用原生符号记号,这样与编译器诊断、静态检查和编辑器高亮的默认行为更一致。只有在确实受限于字符集输入环境时,才建议引入代用记号,并保持仓内风格统一。
与 <iso646.h> 的区别
代用记号属于词法层能力,编译器在记号识别阶段就会把它们视作对应符号;<iso646.h> 中的 and、or 等则是库宏替换,发生在预处理阶段。两者看起来都像“替代写法”,但所处层级不同,排查问题时应分开处理。