作者个人理解的完美的汉语编程。
中文关键字是 Clang/LLVM 的第一公民。英文拼写照旧可用,两种写法可以随意混写。
#包含 <cstdio> // 中文指令,等价于 #include
#include <vector> // 英文指令 —— 混着写没问题
整数 主函数() { // 主函数 = main
std::vector<int> 数字{1, 2, 3}; // 库名仍是英文
整数 和 = 0; // 整数 = int
对于 (整数 n : 数字) // 对于 = for
和 += n;
std::printf("和 = %d\n", 和);
返回 0; // 返回 = return
}完整可编译示例见
vscode-kit/示例.cpp(含类、构造函数、范围 for)。 上面这段、以及包内那份示例,都在发行包自带的编译器上实测编译并运行通过。
入口点可以写 main,也可以写 主函数:
整数 主函数() { 返回 0; } // 等价于 int main() { return 0; }English summary
Chinese++ is a modified Clang/LLVM toolchain that makes Chinese keywords a first-class spelling in C++. English keywords still work, and the two can be mixed freely in the same file.
#包含 <cstdio> // #include — a Chinese preprocessor directive
#include <vector> // English directives still work; mix freely
整数 主函数() { // int main()
std::vector<int> 数字{1, 2, 3}; // library names stay English
整数 和 = 0; // int
对于 (整数 n : 数字) // for
和 += n;
std::printf("和 = %d\n", 和);
返回 0; // return
}- 99 Chinese keyword spellings, 22 Chinese preprocessor directives, 7344/7374 translated diagnostic messages
主函数is the same identifier asmain- The standard library deliberately keeps its English names — renaming it would cut the project off from the existing ecosystem
- The
error:/warning:prefixes stay English on purpose, so editors and CI keep parsing them - Built on a modified LLVM/Clang 24.0.0git, distributed under Apache-2.0 WITH LLVM-exception (see
LICENSE.TXT); modification notice inNOTICE.txt - Windows x64 only (
x86_64-pc-windows-msvc)
Requirement: the MSVC STL and Windows SDK are not bundled — install Visual Studio Build Tools with the C++ workload first, or compilation will fail with file not found: 'cstdio'.
Quick start: install that workload → double-click 一键安装.cmd → run verify.ps1 to prove it works.
学 C++ 最痛的时刻不是敲 int,是编译器甩给你一屏英文。
本工具链把 7344 / 7374 条诊断正文翻成了中文。前缀 error: 故意保留英文 —— 编辑器的问题面板和 CI 脚本靠它抓日志,翻成「错误:」它们就抓不到了。
源码(故意留两个错):
结构 坐标 { // 结构 = struct
整数 纵坐标;
};
坐标点 甲; // 错 1:没有这个类型
整数 主函数() {
坐标 点;
返回 点.横坐标; // 错 2:没有这个成员
}英文(-fno-chinese-diagnostics):
示例.cpp:5:1: error: unknown type name '坐标点'; did you mean '坐标'?
5 | 坐标点 甲; // 错 1:没有这个类型
| ^~~~~~
| 坐标
示例.cpp:1:8: note: '坐标' declared here
1 | 结构 坐标 { // 结构 = struct
| ^
示例.cpp:9:16: error: no member named '横坐标' in '坐标'
9 | 返回 点.横坐标; // 错 2:没有这个成员
| ~~ ^
2 errors generated.
中文(默认):
示例.cpp:5:1: error: 未知的类型名(类型名) '坐标点';你是不是想写(类型名) '坐标'?
5 | 坐标点 甲; // 错 1:没有这个类型
| ^~~~~~
| 坐标
示例.cpp:1:8: note: (名字) '坐标' 在此声明
1 | 结构 坐标 { // 结构 = struct
| ^
示例.cpp:9:16: error: (类型名) '坐标' 中没有名为(成员名) '横坐标' 的成员
9 | 返回 点.横坐标; // 错 2:没有这个成员
| ~~ ^
生成了 2 个错误。
上面两段是实测输出(只略去了路径前缀)。注意中文版里那行
note:—— 有「你是不是想写」就一定会跟一条声明位置说明。
这是刻意的角色标注,不是翻译残留。
英文的 no member named '横坐标' in '坐标' 里有两个引号标识符 —— 哪个是成员、哪个是类型,只能靠语序推断;did you mean '坐标'? 里的 '坐标' 同样没说明它是什么。初学者经常推错。
所以我们给引号里的标识符标上它的角色:
error: (类型名) '坐标' 中没有名为(成员名) '横坐标' 的成员
^^^^^^^^ ^^^^^^^^^^
这是类型名 这是成员名
一条消息里有多个标识符时,这个标注让「哪个是什么」一眼可见 —— 不需要先学会 C++ 的行话。
| 角色 | 出现次数 | 角色 | 出现次数 |
|---|---|---|---|
(名字) |
2345 | (选项) |
368 |
(类型) |
1374 | (属性名) |
314 |
(关键字) |
537 | (变量名) |
237 |
(表达式) |
427 | (成员名) |
207 |
(函数名) |
397 | (种类) |
159 |
(类型名) |
387 | (符号) |
140 |
(名字) 最多,因为它是兜底项。 翻译表里写死了一条规则:
能确定的写具体角色;不能确定的写兜底的(名字)。
%0 可能是变量、函数、类、名域……种类不定时就写 (名字) —— 所以它占了将近三分之一。
但不是每个引号都有括注。 角色标注加在标识符上;有些消息里的类型描述本来就是裸的:
error: 无法初始化 变量 ,其类型为 'int',而 左值 的类型为 'const char[13]'
^^^^^ ^^^^^^^^^^^^^^^
这两个没有括注,原文如此
因为汉字之间没有词边界。
英文写 cannot initialize a variable of type 'int',词与词之间天然有空格,眼睛扫过去就知道哪几个字母连成一个词。
中文如果连成一串 —— 无法初始化变量其类型为 —— 读的人要多花一次断句的力气。所以我们在词与词之间补上空格:
整数 主函数() {
整数 甲 = "hello world!"; // 整数 装不下字符串字面量
返回 甲;
}error: 无法初始化 变量 ,其类型为 'int',而 左值 的类型为 'const char[13]'
↑ ↑ ↑
分隔词与词、词与标点 —— 每个空格都是刻意加的
逗号前那个空格也是刻意的 —— 它把前一个词和后面的标点分开,断句更快。
报错信息是拿来扫的,不是拿来读的。加空格让扫的速度接近英文。
chinese++ 你的文件.cpp -fno-chinese-diagnostics-fchinese-diagnostics Print diagnostics in Chinese (default)
-fno-chinese-diagnostics Do not print diagnostics in Chinese
中文只是多一个入口,不是替换。 需要贴给同事、贴到 Stack Overflow、或者写进 CI 日志时,一个开关切回来。
宏在编译器开始诊断之前就已经消失了 —— 它改不了报错里的任何一个字符。
一套修改过的 Clang/LLVM 工具链。改动只集中在"让编译器认得中文"这一件事上:
| 改动 | 规模 |
|---|---|
| 中文关键字拼写表 | 99 条 |
| 中文预处理指令拼写表 | 22 条,与英文等价、可混用 |
| 中文诊断正文表 | 7344 / 7374 条,查不到时回退英文 |
主函数 与 main |
成为同一个标识符 |
英文拼写一律保留、行为不变。 改动不涉及任何 Diagnostic*.td —— 那 17 个文件与上游逐字节相同。
下载: 最新发布版 · 直接下 Chinese++-0.2-win64.zip
在 Releases 页面找 Assets 区块 —— 它可能是折叠的,点一下展开才能看到附件。
已经装过 Visual Studio、且勾了「使用 C++ 的桌面开发」的 —— 跳过这一步。
三条路,挑一条:
# 最快:一行命令
winget install --id Microsoft.VisualStudio.2022.BuildTools --override "--quiet --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"- Build Tools 直链(点开就下安装器,约 2 GB):https://aka.ms/vs/17/release/vs_BuildTools.exe
- 完整版 Visual Studio Community(免费,图形界面更友好):https://visualstudio.microsoft.com/vs/community/ —— 安装时务必勾选「使用 C++ 的桌面开发」
- 官方图文安装教程:https://learn.microsoft.com/cpp/build/vscpp-step-0-installation
下载约 2 GB,装完约占 6 GB,需要管理员权限,需要几分钟。
为什么必须装? 本工具链不自带标准库 —— C++ 标准库(std::vector、std::string…)、C 运行库、Windows SDK 都是微软的东西,没有权利把它们打包分发。
这也是一件好事:正因为用的是微软原封不动的 MSVC STL,本编译器编出来的东西和官方 clang / MSVC 编出来的二进制兼容,可以互相链接,现成的第三方库照用。
没装的症状:编译时报 找不到文件(名字) 'cstdio'。看到「找不到文件」这类错,十有八九就是这一条。
不确定装没装? 跑第 3 步的 verify.ps1 —— 它不但会告诉你缺什么,还会真编一个中文 hello world。
它会做这些事(全部在这个文件夹内):
- 重建 9 个硬链接别名(
clang.exe、clang-cl.exe、lld.exe…) - 生成
env.cmd—— 窗口级 PATH 设置器,不碰你的永久 PATH - 写好
bin\里的三个<驱动名>.cfg(chinese++.cfg/clang++.cfg/clang.cfg)—— 汉化库的搜索路径就在里面。所以你不用记任何-isystem:命令行直接chinese++ 你的.cpp, 编辑器(clangd)读的也是同一份。 ⚠ 里面是绝对路径:移动或改名本文件夹之后,重新双击一次一键安装即可。 - 检查 Visual Studio Build Tools,缺了就打印确切要装什么
- 把官方 VS Code 下载到本目录的
.\vscode\,用便携模式配好(中文语言包 + clangd),你自己装的那个 VS Code 一个字节都不动 - 跑包内自测(21 项):中文关键字、
#包含 <向量>不带任何-I也能编、AddressSanitizer 真报一次 内存错误、--coverage真链上……全过才算能用
需要联网(下载 VS Code 约 320 MB)。断网了就重新双击一次,已装好的部分不会重装,中断的部分会重来,不需要先删掉什么。
powershell -File verify.ps1它会从包内真编一个中文 hello world。过了就是能用。
bin\chinese++.exe C++ 编译器(中文为主,英文照旧可用)
bin\clang.exe C 编译器(与上面是同一个程序,靠文件名分派)
bin\clang-cl.exe MSVC 风格命令行
bin\clang-cpp.exe 仅预处理(-E)
bin\clangd.exe 语言服务(编辑器高亮与补全用)
bin\lld-link.exe Windows 链接器
bin\llvm-ar.exe archiver
bin\llvm-rc.exe Windows 资源编译器
zhstdlib\ ★ 汉化库:119 个中文头
标准库\ 48(向量 / 字符串 / 映射 / 算法 …)
别名\ 43 C运行库\ 25(C标准输入输出 / C数学 …)
windows系统\ 3(Windows系统 / 窗口 / 绘图)
tools\ 两个安装用的小脚本(搜索路径的唯一真相 + 写成 bin\*.cfg)
lib\clang\24\include\ 编译器内建头文件(stddef.h / stdint.h 等)
+ sanitizer\ profile\ fuzzer\ —— 运行时接口头(写 `#include <sanitizer/asan_interface.h>` 用)
lib\clang\24\lib\windows\ compiler-rt 运行时(asan / ubsan / profile)
lib\clang\24\share\ sanitizer 的 ignorelist
vscode-kit\ 编辑器配置套件
安装之后还会多出:
bin\*.cfg(三个搜索路径配置,见第 2 步)、examples\(编辑器配置副本与示例)、env.cmd。vscode\是安装时按需下载的便携编辑器。
上面若干
.exe是同一个程序的硬链接。若复制或解压后硬链接丢失,会变成多份独立副本 —— 功能不受影响,只是占用变大。install.ps1会用New-Item -ItemType HardLink重建。
| 缺什么 | 为什么 | 怎么办 |
|---|---|---|
MSVC STL、Windows SDK、link.exe |
微软的东西,无权分发 | 自己装 Visual Studio Build Tools |
opt / llc / lldb / clang-tidy / libclang / polly |
编译用不到 | —— |
Visual C++ 运行库(MSVCP140.dll、VCRUNTIME140.dll) |
微软可再分发运行库 | 开发机装了 Visual Studio 即已具备 |
orc_rt / xray / memprof 的运行时与头 |
本次构建显式关闭了这三个运行时 | 用不上;要的话得自己按 tools\build_runtimes.ps1 的注释改开关重编 |
覆盖的是「语言本身」:
- 关键字 ——
整数、如果、返回、类型… - 预处理指令 ——
#包含、#定义…(#不能省;写成包含 <cstdio>会被当成未声明的标识符) - 诊断信息正文 —— 报错解释是中文
主函数≡main
还覆盖了「库」这一层(中文是并列多出来的另一种拼写,英文原名照旧可用):
#包含 <向量> // 头名也能用中文;<vector> 照旧
整数 主函数(){
标准::向量<整数> 表; // std::vector<int> 照旧可用
表.尾插(1); 表.尾插(2); // .push_back() 照旧可用
返回 (整数)表.尺寸() == 2 ? 0 : 1; // .size() 照旧可用
}zhstdlib\ 里是 119 个中文头:标准库 48(向量 / 字符串 / 映射 / 算法 / 迭代器…)+ 别名 43 +
C 运行库 25(C标准输入输出 / C数学 / C字符串…)+ windows系统 3(Windows系统:句柄 / 文件 /
进程 / 同步对象 / 内存 / 注册表 / 环境变量 / 动态库 / 时间;
窗口:窗口类 / 消息 / 控件 / 菜单;绘图:GDI,画矩形 / 画线 / 输出文本…)。
边界(说清楚,别误会):中文库是我们另抄、另起名的一层(
标准::向量), 与微软的std::vector内存布局相同、但不是同一个类型,互相传参要显式转换; 微软的头文件一个字节没动 —— 这也是为什么它既"完全是汉语书写的"、又不切断生态。 GDI / 窗口那部分要额外链gdi32.lib/user32.lib(包内使用说明/常见问题有例子)。
同理,报错前缀 error: / warning: 故意保留英文 —— 编辑器的问题面板和 CI 脚本靠这个前缀抓日志,翻成「错误:」它们就抓不到了。
| 文件 | 内容 |
|---|---|
常见问题.md |
使用前必读 —— 安装、编辑器、报错排查 |
中文对照表.md |
中英关键字对照表。由脚本从编译器真正在用的那两张表自动生成,不是手写的 —— 手写的副本一定会和编译器漂移 |
NOTICE.txt |
发行说明、改动清单、第三方声明 |
MANIFEST.txt |
构建时间与各二进制的 SHA256 |
LICENSE.TXT |
许可证正文 |
本发行包里的 clang / lld / clangd / llvm-* 二进制,是由修改过的 LLVM 源码构建的,不是上游原版。
依据 Apache License 2.0 第 4(b) 条,我们在此明确声明:我们改动了若干 LLVM/Clang 源文件。 改动范围与理由见 NOTICE.txt。
- 上游项目:llvm.org(LLVM 24.0.0git)
- 目标平台:
x86_64-pc-windows-msvc
本发行包内 LLVM 派生的全部内容,采用 Apache License v2.0 with LLVM Exceptions 分发。许可证正文完整附于 LICENSE.TXT(15141 字节,与上游 LICENSE.TXT 逐字节相同)。请连同该文件一起分发。
本工具链不是微软官方产品,与 Microsoft 无隶属或背书关系。它使用但你没有获得微软的 MSVC STL、Windows SDK 与 Visual C++ 运行库 —— 那些需要使用者自行安装并遵守微软自己的许可条款。
本工具链按「现状」提供,不附带任何担保。 使用它及其脚本所造成的任何后果 —— 包括但不限于系统或数据损坏、软件冲突、编译产物有问题、项目延期 —— 发布者不承担责任。 请在使用前自行备份重要数据。
本包内 LLVM / Clang 部分依 Apache License v2.0 with LLVM Exceptions 分发,其中的免责与责任限制条款同样适用。
有问题、报 bug、提建议,欢迎在本仓库的 Issues 里提出。