Linux C 编程学习第八天_编码风格
终于可以换个方向了,这章我来学习编码风格。
一开始我们就知道,代码是写给人看的,不是给机器看的,所以代码的书写就必须要做到可读性高,就和写字一样,如果写的歪歪扭扭乱七八糟,我想语文老师是不会给你高分的,甚至都不想看你的作业,哈哈。
代码和文字一样,是为了表达思想,记载信息,所以一定要写的清楚整洁才能有效表达,所以,每个项目中代码的风格都会尽可能保持一致,我想我们应该都听过一本书《代码整洁之道》,这也是为什么我不爱看别人代码一样,哈哈哈,有时候看到别人乱七八糟的代码还不如自己直接从头写(说不定别人看到你的代码也是这样的想法~)
缩进和空白
以前看过一个段子,说一对男女朋友都是程序员,但是男方习惯用tab,女方喜欢按空格缩进,在一起写代码的时候,男方听到疯狂按空格键就头大,因为这点不和所以两人双双分手。虽然我也十分推崇使用tab,但是如果我的女朋友喜欢按空格,我也不会在意的,虽然我没有女朋友(T-T)
咳咳,扯远了,我们先来看一下c代码风格对于空白符号的主要规定(列举一些常见的):
1、关键字 if while for 与后面的()应该加一个空格,但()内的表达式应该紧贴括号:
2、双目运算符的两侧加一个空格分隔,弹幕运算符和操作数之间不加:
3、后缀运算符和操作数之间也不加空格:
4、,号和;号之后要加空格,这是英文的书写习惯。
5、有时候可以为了突出优先级而将代码写的更加紧凑一些,方便阅读。
6、由于标准的Linux终端是24行80列的,接近或大于80个字符的较长语句要折行写,折行后用空格和上面的表达式或参数对齐。
7、较长的字符串和多维数组可以分行书写。
8、可以使用tab将变量名或者代码对齐,不过不是严格要求的
关于缩进的规则有以下几条:
1、要用缩进体现语句块的层次关系,使用Tab进行缩进,不能使用空格。不同的编译器Tab和表示的空格数不同,可能会造成非常大的混乱。
2、函数定义的{和}单独占一行。
3、if/else、while、do/while、for、switch这些可以带语句块的语句,语句块的{和}应该和关 键字写在一起,用空格隔开,而不是单独占一行。
这样的好处是不必占用太多行,使得一屏可以显示更多代码,但是传统 { } 单独分为一行的写法也比较广泛,只需要在统一项目中保持一致就行。
4、switch和语句块里的case、default对齐写,也就是说语句块里的case、default相对 于switch不往里缩进。
这点我还是真没想到:
5、代码中每个逻辑段落之间应该用一个空行分隔开。例如每个函数定义之间应该插入一个空行,头文件、全局变量定义和函数定义之间也应该插入空行。
6、一个函数的语句列表如果很长,也可以根据相关性分成若干组,用空行分隔,这条规定不是 严格要求,一般变量定义语句组成一组,后面要加空行,return之前要加空行。
还好,平时编码习惯好的话,这些只需要注意一下就可以了。
注释
//
/* */
/*******************
XXXXXXXXXXXX
*******************/
/***************\
\***************/
注释的使用场合:
1、整个源文件的顶部注释。说明此模块的相关信息,例如文件名、作者和版本历史等,顶头写 不缩进。
2、函数注释。说明此函数的功能、参数、返回值、错误码等,写在函数定义上侧,和此函数定 义之间不留空行,顶头写不缩进
3、相对独立的语句组注释。对这一组语句做特别说明,写在语句组上侧,和此语句组之间不留 空行,与当前语句组的缩进一致。注意,说明语句组的注释一定要写在语句组上面,不能写在 语句组下面
4、代码行右侧的简短注释。对当前代码行做特别说明,一般为单行注释,和代码之间至少用一 个空格隔开,一个源文件中所有的右侧注释最好能上下对齐。
函数内的注释要尽可能少用。注释只是用来说明你的代码能做什么(比如函数接口定义),而不是说明怎样做的,只要代码写得足够清晰,怎样做是一目了然的,如果你需要用注释才能解释清楚,那就表示你的代码可读性很差,除非是特别需要提醒注 意的地方才使用函数内注释。
5、复杂的结构体定义比函数更需要注释
6、复杂的宏定义和变量定义也需要注释
标识符命名
需要遵循以下原则:
1、标识符的命名要清晰明了,可以使用完整的单词和大家易于理解的缩写。短的单词可以通过去元音形成缩写,较长的单词可以取单词的头几个字母形成缩写,也可以采用大家基本认同的缩写。例如count写成cnt,block写成blk,length写成len,window写 成win,message写成msg,temporary可以写成temp,也可以进一步写成tmp
2、内核风格规定变量、函数和类型采用全小写加下划线的方式命名,常量(宏定义和枚举常 量)采用全大写加下划线的方式命名。上面举例的函数名radix_tree_insert、类型名struct radix_tree_root、常量名RADIX_TREE_MAP_SHIFT等。
3、全局变量和全局函数的命名一定要详细,不惜多用几个单词多写几个下划线,例如函数 名radix_tree_insert,因为它们在整个项目的许多源文件中都会用到,必须让使用者明确 这个变量或函数是干什么用的。局部变量和只在一个源文件中调用的内部函数的命名可以 简略一些,但不能太短,不要使用单个字母做变量名,只有一个例外:用i、j、k做循环变 量是可以的
4、针对中国程序员的一条特别规定:禁止用汉语拼音作为标识符名称,可读性极差
关于第四点还真是不好意思,有时候为了方便就顺数拼音了,咳咳,这个一定要注意。
函数
每个函数都应该设计的尽可能简单,简单的函数才容易维护:
1、一个函数最好只是为了做好一件事,不要把函数设计成用途广泛,面面俱到的,举个很简单的例子,你看你现在手机上的app,不断更新增加杂七杂八的功能,你真正用到的有几个?功能多意为着杂乱,意味着没有一个功能是最好的,意味着不好维护和超长代码,意味着不好重用。
2、函数内部的缩进层次不宜过多,一般少于4层,多了就意味着函数设计的太复杂了,该分割几个小函数来用了(这称之为:Helper Function)
3、函数不要写得太长,建议在24行的标准终端上不超过两屏,太长会造成阅读困难,如果一 个函数超过两屏就应该考虑分割函数了。[CodingStyle]中特别说明,如果一个函数在概念 上是简单的,只是长度很长,这倒没关系。例如函数由一个大的switch组成,其中有非常 多的case,这是可以的,因为各个case之间互不影响,整个函数的复杂度只等于其中一 个case的复杂度,这种情况很常见,例如TCP协议的状态机实现
4、执行函数就是执行一个动作,函数名通常应包含动词,例 如get_current、radix_tree_insert
5、比较重要的函数定义上面必须加注释,说此函数的功能、参数、返回值、错误码等
6、另一种度量函数复杂度的办法是看有多少个局部变量,5到10个局部变量就已经很多了, 局部变量再多就很难维护了,应该考虑分割函数
indent 工具
为了养成良好的编码习惯,这个还是先不要了解了