琉离铟落的小窝琉离铟落的小窝
← 返回文章列表
2026-06-24
#Cangjie#入门教程

仓颉的标识符

为程序元素命名

万恶起源——为程序元素命名
ℹ️NOTE

对于熟悉其他编程语言的读者或者不在意较多细节内容的读者,可以跳过本节内容或者直接总结查看部分

1.3.1 什么是标识符?

在编程中,标识符就是给程序中的各种元素起的名字,比如变量名、函数名等。就好比现实生活中给人起名字一样,仓颉语言对"名字"有一些规则要求。

仓颉的标识符分为两类:

  • 普通标识符 —— 最常用的命名方式
  • 原始标识符 —— 一种特殊的命名方式,允许使用关键字作为名字

下面我们分别介绍。


1.3.2 普通标识符

命名规则

普通标识符的命名规则可以简单理解为:

  1. 开头字符只能是:中文字符、英文字母、下划线(_)、其他符合XID_Start的字符
  2. 开头之后可以接:中文字符、英文字母、数字、下划线、其他符合XID_Continue的字符
  3. 不能与仓颉的关键字相同(如 mainforwhilespawn 等)
🚨CAUTION

数字不能开头!3abc 是非法的。

另外,如果用下划线 _ 开头,后面至少要跟一个字符,不能只有一个孤零零的 _

💡TIP

此处并非指_不能作为标识符使用,见Q2

示例

Cangjie
// ✅ 合法的普通标识符
hello       // 英文字母开头
test
Demo
_abc_       // 下划线开头,后面有字符
仓颉         // 中文开头
a1b1c1      // 字母开头,后面接数字

// ❌ 非法的普通标识符
ab&c    // & 不是合法字符
3abc    // 数字不能作为开头
while   // while 是仓颉关键字,普通标识符不能用

1.3.3 原始标识符

为什么需要原始标识符?

有时候你可能需要用仓颉的关键字(如 ifwhile)作为名字,但普通标识符不允许这样做。这时候就可以用原始标识符

使用方式

在普通标识符或关键字的外面加上一对反引号` `)即可:

Cangjie
// ✅ 合法的原始标识符
`abc`       // 普通标识符加反引号
`_abc`
`a1b2c3`
`if`        // 关键字加反引号,现在可以作为名字使用了
`while`

// ❌ 非法的原始标识符
`ab&c`      // 内部的普通标识符本身就不合法
`3abc`      // 同上,数字不能开头

使用场景

ℹ️NOTE

下方代码暂时看不懂也没有关系, 后续会详细学习

Cangjie
main() {
    let a = 1
    a |> println
    `test`()   // 如果 test 是关键字,可以用反引号包裹
}

func `test`() {

}

1.3.4 关于 Unicode 字符集(选读)

ℹ️NOTE

本节内容偏底层细节,初学者可以跳过,了解"标识符支持中文和英文开头"即可。

仓颉的标识符规则基于 Unicode 标准 15.0.0,涉及两个核心概念:

  • XID_Start:可以作为标识符开头的字符集合,包含中文、英文字母等
  • XID_Continue:可以作为标识符后续字符的集合,包含中文、英文字母、阿拉伯数字等

也就是说,前面说的"开头字符"和"后续字符"的规则,本质上就是 XID_Start 和 XID_Continue 的定义。

此外,仓颉会对所有标识符进行 NFC 规范化。简单来说,如果两个标识符在 NFC 后长得一样,它们会被视为同一个标识符。

详细定义可参考 Unicode 标准文档

1.3.5 总结

类型 规则 示例
普通标识符 中文/字母/_ 开头,后接中文/字母/数字/_(不可单独出现);不能是关键字 hello仓颉_abc
原始标识符 用反引号包裹普通标识符或关键字 `if``while``abc`

一句话记忆:普通标识符用中文/字母/下划线开头,不能是关键字;想用关键字当名字就加反引号。


1.3.6 常见问题

Q1:可以用中文命名变量吗?

可以!仓颉支持中文字符作为标识符,这是仓颉的特色之一:

Cangjie
let 年龄 = 18
let 姓名 = "张三"
💡TIP

虽然技术上完全合法,但在实际项目中,建议在使用英文命名,避免出现编码错误。

Q2:为什么 `_` 不能单独作标识符?

在仓颉中,单独的 _ 有特殊用途——它表示"我不在乎这个值",常用于忽略不需要的变量。比如从函数返回多个值时,用 _ 表示"这个返回值我不需要"。

Cangjie
let (name, _) = ("小明", 18)  // 只关心 name,不关心年龄

所以 _ 被保留作特殊用法,不能当作普通标识符。

Q3:关键字有多少个?我该怎么记住?

仓颉有几十个关键字,包括 mainifelseforwhileletvarfuncclassstruct 等等。

不需要死记硬背! 你只需要知道:

  • 使用普通标识符时,如果编译器报错说"这个是关键字",换个名字就行
  • 实在想用关键字做名字,加反引号用原始标识符