
C Programming Language
Practice #05: Convention of Naming Identifier
# Basic Tutorial, # Programming Language, # C Programming LanguageLast Updated: 2020-01-01
前置知识
在阅读本文档前,请先了解良好的代码风格的重要性,详见 Practice #04: Develop Good Coding Style and Programming Habits 。
前言
你应当已经知道,为了保持良好的代码风格,在程序中应该使用统一的命名习惯来为标识符命名。
本文将对几种常见的命名法进行科普,并介绍 C 语言的命名习俗。注意,我介绍的只是最常见的习惯,在实际情况中很可能会有所不同,在大团队中也很可能会有其额外的命名规范。
可能存在一些关于命名法孰优孰劣的论战,我个人认为,只要命名统一,使用何种命名习惯并不重要。
建议初学者在写程序时入乡随俗即可,与大环境统一总是百利而无一害的。当然,如果你需要进行团队合作,那么除了编程语言的习俗,更应当注重与你的团队保持相同的命名习惯。
常见的命名法
下划线命名法 (Underscore Case)
使用下划线来划分变量名中的多个单词,例如:
-
变量 - 用户名:
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
驼峰命名法 (Camel Case)
变量名中的第一个单词首字母小写,之后的每个单词首字母大写,例如:
-
变量 - 用户名:
userName,nameUser -
变量 - 学生编号:
studentId,idStudent -
变量 - 数组
a的长度:aSize -
函数 - 计算总成绩:
calcTotalScore,getTotalScore -
函数 - 显示信息:
displayMessage,displayMsg -
结构体 - 内存块:
memoryBlock
帕斯卡命名法 (Pascal Case)
又称大驼峰命名法,变量名中的每个单词首字母大写,例如:
-
变量 - 用户名:
UserName,NameUser -
变量 - 学生编号:
StudentId,IdStudent -
函数 - 计算总成绩:
CalcTotalScore,GetTotalScore -
函数 - 显示信息:
DisplayMessage,DisplayMsg -
结构体 - 内存块:
MemoryBlock
匈牙利命名法 (Hungarian Case)
相比于前三种命名法而言,匈牙利命名法要复杂和繁琐得多,主要应用于 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 等名称就是比较合理的。
其三,使用统一的命名习惯。
例如对所有变量都用下划线命名法、对所有结构体都用驼峰命名法,或是对某一类特别的结构体用下划线命名法也是可以的,但毫无章法地混用不同的命名习惯是不可取的。
C 语言的命名习俗
最常见的命名习惯如下表所示:
| 标识符类型 | 常见命名习惯 | 示例 |
|---|---|---|
| 变量 | 下划线命名法 | 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 | 频率 |