C Programming Language

Practice #05: Convention of Naming Identifier

# Basic Tutorial,  # Programming Language,  # C Programming Language

Last 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 编程中。初学者可以对此暂不理会,如果读者有兴趣可以自行百度相关内容。


命名的基本原则

其一,使标识符(可能包括变量、函数、宏定义、用户自定义类型等)的名称尽量清晰地体现出标识符的用途。

例如用于表示用户名的变量就应该命名为 usernameuser_nameuserNamenameOfUser 等等,随你喜欢,但是绝不应该命名为 unmenmhahaha 等等,过度缩写的名称或是毫无意义的名称都是不可取的。

其二,不要让标识符的名称过于冗长,但也不要为了名称的简短而过度损害其语义清晰性。

例如 student_name_in_xi_an_jiaotong_university 显然是一个为了语义清晰而起得过度冗长的名称,但是 stunmxj 显然是缩减过度了,诸如 studentNameXJTUnameStudentXJTUstu_xjtu_namename_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, temptemporary临时变量
resresult结果
ansanswer答案
tottotal全部的
numnumber
valvalue
tstime stamp时间戳
a, arrarray数组
lenlength长度
sizsize长度,大小
i, idxindex索引,下标
ititeration迭代器
cntcount计数器
s, strstring字符串
p, ptrpointer指针
posposition位置
prv, prevprevious前一个,前继
nxt, nextnext下一个,后继
srcsource
dstdestination目标
rowrow
colcolumn
midmiddle中值
缩写名称可能的英文全称对应中文释义
initinitialize初始化
defdefine定义
deldelete删除
optoperate操作
incincrement增量
decdecrement减量
movmove移动
cpycopy复制
cmpcompare比较
缩写名称可能的英文全称对应中文释义
dis, distdistance距离
calccalculation计算,求解
sumsummation总和
prodproduction总乘积
avgaverage平均值
expexpection期望
expexponential指数函数 exe^x
addaddition
subsubtraction
mulmultiplication
divdivision
modmodulo模运算
sqrsquare平方
sqrtsquare root平方根
缩写名称可能的英文全称对应中文释义
memmemory内存
bufbuffer缓冲区
imgimage图片;镜像
ctrlcontrol控制
dispdisplay显示
msgmessage消息
pkgpackage
freqfrequency频率