中文对照表
99 个关键字拼写 + 22 条预处理指令 —— 中英并列,写哪个都行。
下面按教程的课次整理(这是常用的一组,共 58 条)。 完整的 99 个拼写见发行包里的 docs\ 与中文诊断提示。
第 1 课 程序骨架
| 汉语 | 英文 | 干什么 | | 整数 | int | 整数类型;整数 主函数() 里的 主函数 是 main 的汉语名 | | 主函数 | main | 程序入口。和 main 是同一个标识符,写哪个都行,但不能两个都写 | | 空型 | void | 「什么也不返回」 | | 返回 | return | 从函数返回 | | #包含 | #include | 把另一个文件的内容引进来 |
第 2 课 变量与类型
| 汉语 | 英文 | 干什么 | | 整数 | int | 整数 | | 双精度 | double | 双精度浮点 | | 单精度 | float | 单精度浮点 | | 字符 | char | 单个字符 | | 布尔 | bool | 真/假 | | 真值 / 假值 | true / false | 布尔字面量 | | 自动 | auto | 类型由右边的值推出来 | | 常量 | const | 之后不许改 | | 长型 / 短型 | long / short | 更宽/更窄的整数 | | 无符号 / 有符号 | unsigned / signed | 有没有符号位 | | 空指针 | nullptr | 空指针值(不是类型) | | 大小 | sizeof | 某个类型/值占多少字节 |
第 3 课 运算符与符号
| 汉语 | 等价英文 | 等价符号 | | 并且 | and | && | | 或者 | or | \|\| | | 并非 | not | ! | | 不等于 | not_eq | != | | 位与 | bitand | & | | 位或 | bitor | \| | | 异或 | xor | ^ | | 取反 | compl | ~ | | 与赋值 | and_eq | &= | | 或赋值 | or_eq | \|= | | 异或赋值 | xor_eq | ^= |
第 4 课 分支与循环
| 汉语 | 英文 | 干什么 | | 如果 / 否则 | if / else | 分支 | | 选择 | switch | 多分支 | | 情形 | case | 选择里的一个分支 | | 默认 | default | 选择里的兜底分支 | | 对于 | for | 计次循环 / 范围遍历 | | 每当 | while | 先判断再执行 | | 执行 | do | 先执行一次再判断(搭配 每当 收尾) | | 跳出 | break | 结束整个循环 | | 跳过 | continue | 跳过本轮剩下的 |
第 5 课 函数
| 汉语 | 英文 | 干什么 | | 空型 | void | 不返回值 | | 返回 | return | 返回值 / 提前结束 | | 自动 | auto | 让编译器推返回类型 | | 常量 | const | 只读参数 |
第 6 课 自己定义类型
| 汉语 | 英文 | 干什么 | | 类型 | class | 定义类型(注意:不是「类」,汉语关键字一律不少于两个字) | | 结构 | struct | 默认成员公开的类型 | | 枚举 | enum | 枚举 | | 公开 / 私有 / 受保护 | public / private / protected | 访问说明符 | | 自身 | this | 指向当前对象 | | 虚拟 | virtual | 允许派生类改写 | | 重写 | override | 声明「我在改写基类的虚函数」 | | 最终 | final | 到此为止,不许再被继承/改写 | | 静态 | static | 属于类型本身,不属于某个对象 | | 新建 / 删除 | new / delete | 动态分配 / 释放 | | 使用 | using | 引进名字 / 起别名 | | 类型别名 | typedef | 起类型别名(老写法) |
第 7 课 模板与名域
| 汉语 | 英文 | 干什么 | | 模板 | template | 声明模板 | | 类型名 | typename | 模板里表示「某个类型」 | | 名域 | namespace | 名域 | | 使用 | using | 引进名字 | | 常量表达式 | constexpr | 编译期就能算出来的常量/函数 |
预处理指令(22 条)
| 英文 | 中文 | 英文字数 | 英文 | 中文 | 英文字数 |
|---|---|---|---|---|---|
| --- | --- | --- | --- | --- | --- |
#if | #如果 | 2 | #pragma | #编译指示 | 4 |
#ifdef | #如果已定义 | 5 | #embed | #嵌入 | 2 |
#ifndef | #如果未定义 | 5 | #module | #模块 | 2 |
#elif | #否则若 | 3 | #import | #导入 | 2 |
#elifdef | #否则若已定义 | 6 | #include_next | #包含下一个 | 5 |
#elifndef | #否则若未定义 | 6 | #warning | #警告 | 2 |
#else | #否则 | 2 | #ident | #标识 | 2 |
#endif | #结束如果 | 4 | #assert | #断言 | 2 |
#include | #包含 | 2 | #unassert | #取消断言 | 4 |
#define | #定义 | 2 | #line | #行号 | 2 |
#undef | #取消定义 | 4 | #error | #错误 | 2 |
| 拼写 | 原因 | ||||
| --- | --- | ||||
__include_macros | 编译器内部拼写 | ||||
__preprocessed_module | 写进 PCH / 模块文件(.pcm),动它影响二进制格式兼容 | ||||
__preprocessed_import | 同上 | ||||
__public_macro / __private_macro | 同上 | ||||
sccs | 1980 年代 SCCS 遗留,Clang 默认报错 | ||||
| 读取者 | 位置 | 作用 | |||
| --- | --- | --- | |||
| 指令分发 | IdentifierTable.cpp 的 lookupChineseDirective() | 非 ASCII 名字 → tok::pp_* | |||
| 跳过路径 | PPDirectives.cpp 的 chineseDirectiveEnglishSpelling() | 中文拼写就地换成英文 | |||
| 依赖扫描 | DependencyDirectivesScanner.cpp 的 .Case(...) 表 | 见第四节 | |||
| 观察 | 结论 | ||||
| --- | --- | ||||
#模块 m; 报错 | 忠实。英文 #module m; 也报「无效的预处理指令」—— PPDirectives.cpp:1455 要求引出名是模块上下文关键字,# 形式本来就不合法 | ||||
#导入 "x.h" | 改动前就能用。导入 有 KEYMODULES 标志位 → tok::pp_import → HandleImportDirective。报的是「导入类型库是不受支持的 Microsoft 特性」,与 #import 一字不差 | ||||
#断言 / #取消断言 报错 | 忠实。case tok::pp_assert: break; 是上游未实现(FIXME),英文一样报错 | ||||
#否则若 vs 否则 | 是两个不同的标识符。汉字是 XID_Continue,词法做最长匹配,否则若 不会被切成 否则 + 若 | ||||
如果 / 否则 既是关键字又是指令名 | 正确,与英文 if / else 的双重身份一致。指令名在 ParsingPreprocessorDirective 下不做关键字映射 | ||||
| 位置 | 校核什么 | ||||
| --- | --- | ||||
verify_chinese_keywords.py 第 11.8 节 | 正文(只查字符串字面量)里的可译指令必须是中文。自测四条:正文英文要被抓到;.def 的 include guard 不许被误伤;注释不许被误伤;#pragma 子名字层不许被误伤 | ||||
diag_id_lookup.py check_protected_tokens | 引号里的指令拼写必须写成中文(原来这条把 '#embed' 当受保护记号要求原样保留) | ||||
diag_id_lookup.py --self-test | 指令例外本身 5 条用例;另外断言映射表真的读到了东西、且 pragma / __include_macros / sccs 不在表里 |