C语言学习指南:从规范编程到专业级开发
上QQ阅读APP看书,第一时间看更新

2.4.1 了解函数的标识符

main()也是一个函数,但main()函数跟那些函数之间有一个重要的区别,即它的标识符(或者说它的名称)是C语言预先规定好的,也就是说,这个用来表示程序入口的函数必须叫作main。另外,main函数的签名也是预先规定好的,你只能在预定的两种形式里面选择,而不能自己随意设计。程序里面的其他函数不能叫作main。你不可在程序里面手工调用main函数,因为这个函数只应该由系统来调用。

函数的标识符应该描述出函数的意图,让我们一看到这个名称,就知道它是用来做什么的。比方说,你一看到名叫printGreeting()的函数,就知道这是用来打印某条欢迎词的。同理,你一看到名叫printWord()的函数,就知道这是用来打印某个单词的。我们总是应该给函数起一个与功能相符的名称。如果不这样做,那别人就很难了解这个函数的作用,例如Moe()、Larry()及Curly()等函数名称就不太好理解,即便你在命名时确有自己的一番道理,还是很难让别人了解你当时的意思,所以这样给函数命名是很不好的。

函数的标识符区分大小写。这意味着main、MAIN、Main与maiN是四个不同的函数名。虽然C语言的语法允许你采用全大写的形式给函数起名,但这种名称并不合适,因为它缺乏大小写方面的变化,我们看不出单词与单词之间的界限。全大写的文本读起来很困难,所以最好不要这么写。其实不单是函数标识符,C语言里面的所有标识符都区分大小写。因此,刚说的那条建议也适用于那些标识符。

有一个地方例外,也就是预处理指令里面用到的名称,这种名称可以采用全大写的形式。按照惯例,我们应该用大写字母表示这样的名称,并用下划线来连接名称中的各个单词。这种做法是由历史原因造成的。我们只应该在预处理指令所用到的名称中采用这种形式,而不应该把它用在普通的C语言代码里面。这样我们就能清楚地分辨出:所有字母都大写的名称是预处理指令里面提到的名称,这些名称会由预处理器(preprocessor)处理,而采用小写字母所写的名称则是普通的C语言代码里面所用到的名称,这些名称表示程序里面的标识符。

如果两个函数的功能大致相似,只是稍微有一些区别,那么最好不要通过大小写来表示这种区别,而应该用长度不同或者差别比较突出的名称来给这些函数命名,这样效果要好得多。比方说,如果有三个函数,分别用来将某段文本变成深浅不同的三种绿色(也就是浅绿(light green)、绿色(green)及深绿色(dark green)),那么有些人可能会把这三个函数叫作makegreen()、makeGreen()与makeGREEN(),虽然这三个名称在green(绿)一词的大小写上有所变化,但毕竟不如直接叫makeLightGreen()、makeGreen()与makeDarkGreen()更明确。

有两种常见的命名方式可以让函数的名称清晰易读,一种是驼峰命名法(camel-case),另一种是蛇形命名法(snake-case),也就是用下划线来分隔的(underscore-separated)命名办法。驼峰命名法会让名称中除第一个单词外的其他单词都以大写字母开头。蛇形命名法不调整大小写,而是用下划线(_)来分隔这些单词:

全小写命名法:makelightgreen()、makemediumgreen()、makedarkgreen()。

驼峰命名法:makeLightGreen()、makeMediumGreen()、makeDarkGreen()。

蛇形命名法(也叫下划线分隔命名法):make_light_green()、make_medium_green()、make_dark_green()。

大家都看到了,采用全小写的形式来起名读起来有点困难,但依然比采用全大写的形式要好。另外两种形式,看起来则要更加清晰。因此,我们总是应该在这两种里面选择一种,而不会采取全大写或全小写的命名方式。

选定了某种命名方式之后,就应该在整个程序里面坚持用这种方式,而不应该混用各种命名方式,因为那样会让函数标识符与其他一些标识符变得不太好记,而且容易出错。