Last Updated: 2020-01-01
在阅读本文档前,请先了解良好的代码风格的重要性,详见 Practice #04: Develop Good Coding Style and Programming Habits 。
你应当已经知道,为了保持良好的代码风格,在程序中应该使用统一的命名习惯来为标识符命名。
本文将对几种常见的命名法进行科普,并介绍 C 语言的命名习俗。注意,我介绍的只是最常见的习惯,在实际情况中很可能会有所不同,在大团队中也很可能会有其额外的命名规范。
可能存在一些关于命名法孰优孰劣的论战,我个人认为,只要命名统一,使用何种命名习惯并不重要。
建议初学者在写程序时入乡随俗即可,与大环境统一总是百利而无一害的。当然,如果你需要进行团队合作,那么除了编程语言的习俗,更应当注重与你的团队保持相同的命名习惯。
使用下划线来划分变量名中的多个单词,例如:
变量 - 用户名: user_name
, name_user
变量 - 学生编号: student_id
, id_student
变量 - 数组 a
的长度: a_size
, size_a
函数 - 计算总成绩: calc_total_score
, get_total_score
函数 - 显示信息: display_message
, display_msg
结构体 - 内存块: memory_block
变量名中的第一个单词首字母小写,之后的每个单词首字母大写,例如:
变量 - 用户名: userName
, nameUser
变量 - 学生编号: studentId
, idStudent
变量 - 数组 a
的长度: aSize
函数 - 计算总成绩: calcTotalScore
, getTotalScore
函数 - 显示信息: displayMessage
, displayMsg
结构体 - 内存块: memoryBlock
又称大驼峰命名法,变量名中的每个单词首字母大写,例如:
变量 - 用户名: UserName
, NameUser
变量 - 学生编号: StudentId
, IdStudent
函数 - 计算总成绩: CalcTotalScore
, GetTotalScore
函数 - 显示信息: DisplayMessage
, DisplayMsg
结构体 - 内存块: MemoryBlock
相比于前三种命名法而言,匈牙利命名法要复杂和繁琐得多,主要应用于 Microsoft Windows 编程中。初学者可以对此暂不理会,如果读者有兴趣可以自行百度相关内容。
其一,使标识符(可能包括变量、函数、宏定义、用户自定义类型等)的名称尽量清晰地体现出标识符的用途。
例如用于表示用户名的变量就应该命名为 username
、 user_name
、 userName
、 nameOfUser
等等,随你喜欢,但是绝不应该命名为 unme
、 nm
、 hahaha
等等,过度缩写的名称或是毫无意义的名称都是不可取的。
其二,不要让标识符的名称过于冗长,但也不要为了名称的简短而过度损害其语义清晰性。
例如 student_name_in_xi_an_jiaotong_university
显然是一个为了语义清晰而起得过度冗长的名称,但是 stunmxj
显然是缩减过度了,诸如 studentNameXJTU
、 nameStudentXJTU
、 stu_xjtu_name
、 name_stu_XJTU
等名称就是比较合理的。
其三,使用统一的命名习惯。
例如对所有变量都用下划线命名法、对所有结构体都用驼峰命名法,或是对某一类特别的结构体用下划线命名法也是可以的,但毫无章法地混用不同的命名习惯是不可取的。
最常见的命名习惯如下表所示:
标识符类型 | 常见命名习惯 | 示例 |
---|---|---|
变量 | 下划线命名法 | user_name |
函数 | 下划线命名法 | send_msg |
常量及宏定义 | 下划线命名法,且所有字母大写 | MAX_SIZE |
结构体和联合体类型 | 下划线命名法 或 帕斯卡命名法 | memory_block or MemoryBlock |
枚举类型 | 类型名同“结构体类型”,内部成员同“常量及宏定义” | typedef enum {RED, GREEN, BLUE} color_pri; |
此外,在团队中一般会有额外的命名规范来保证代码质量,例如:
全局变量名要加上 _g
后缀,例如 int g_local_time;
;
类型别名要加上 _t
后缀,例如 typedef struct student {...} student_t;
;
用宏定义防止头文件多重包含时,宏定义名要加上 _H
后缀;
注意这里只是举一些例子让读者理解这件事情,初学者写玩具级代码没必要搞这么复杂的规范,能理解规范和必要性即可。
有一些非常常用的短小的名称,大家经常会对其进行“过度缩写”,因为几乎所有人都能理解这些缩写。但是初学者看到可能会很头大,为了减少初学者将来阅读和学习他人代码时遇到的阻力,特汇总于此。
缩写名称 | 可能的英文全称 | 对应中文释义 |
---|---|---|
t, tmp, temp | temporary | 临时变量 |
res | result | 结果 |
ans | answer | 答案 |
tot | total | 全部的 |
num | number | 数 |
val | value | 值 |
ts | time stamp | 时间戳 |
a, arr | array | 数组 |
len | length | 长度 |
siz | size | 长度,大小 |
i, idx | index | 索引,下标 |
it | iteration | 迭代器 |
cnt | count | 计数器 |
s, str | string | 字符串 |
p, ptr | pointer | 指针 |
pos | position | 位置 |
prv, prev | previous | 前一个,前继 |
nxt, next | next | 下一个,后继 |
src | source | 源 |
dst | destination | 目标 |
row | row | 行 |
col | column | 列 |
mid | middle | 中值 |
缩写名称 | 可能的英文全称 | 对应中文释义 |
---|---|---|
init | initialize | 初始化 |
def | define | 定义 |
del | delete | 删除 |
opt | operate | 操作 |
inc | increment | 增量 |
dec | decrement | 减量 |
mov | move | 移动 |
cpy | copy | 复制 |
cmp | compare | 比较 |
缩写名称 | 可能的英文全称 | 对应中文释义 |
---|---|---|
dis, dist | distance | 距离 |
calc | calculation | 计算,求解 |
sum | summation | 总和 |
prod | production | 总乘积 |
avg | average | 平均值 |
exp | expection | 期望 |
exp | exponential | 指数函数 |
add | addition | 加 |
sub | subtraction | 减 |
mul | multiplication | 乘 |
div | division | 除 |
mod | modulo | 模运算 |
sqr | square | 平方 |
sqrt | square root | 平方根 |
缩写名称 | 可能的英文全称 | 对应中文释义 |
---|---|---|
mem | memory | 内存 |
buf | buffer | 缓冲区 |
img | image | 图片;镜像 |
ctrl | control | 控制 |
disp | display | 显示 |
msg | message | 消息 |
pkg | package | 包 |
freq | frequency | 频率 |