如何让C++中的代码规范一点

如何让C++中的代码规范一点,第1张

1.关键字if, while, for与其后的控制表达式的(括号之间插入一个空格分隔,但括号内的表达式应紧贴括号。

例如:while ␣(1)

2.双目运算符的两侧插入一个空格分隔,单目运算符和 *** 作数之间不加空格。

例如:i␣=␣i␣+␣1、++i、!(i␣<␣1)、-x、&a[1]等。

3.后缀运算符和 *** 作数之间也不加空格。

例如:取结构体成员s.a、函数调用foo(arg1)、取数组成员a[i]。

4. 、,号和号之后要加空格,这是英文的书写习惯。

例如:for␣(i␣=␣1␣i␣<␣10␣i++)、foo(arg1,␣arg2)。

5.以上关于双目运算符和后缀运算符的规则不是严格要求,有时候为了突出优先级也可以写得更紧凑一些.

例如:for␣(i=1␣i<10␣i++)、distance␣=␣sqrt(x*x␣+␣y*y)等。但是省略的空格一定不要误导了读代码的人,例如a||b␣&&␣c很容易让人理解成错误的优先级。

6.由于标准的Linux终端是24行80列的,接近或大于80个字符的较长语句要折行写,折行后用空格和上面的表达式或参数对齐。

例如: if␣(sqrt(x*x␣+␣y*y) >5.0

&&␣x␣<␣0.0

&&␣y␣>␣0.0)

缩进

内核关于缩进的规则有以下几条:

1.要用缩进体现出语句块的层次关系,使用Tab字符缩进,不能用空格代替Tab。函数里面的代码,也称为代码块或复合代码,要求进行缩进。遇到循环和分支结构的处理,循环和分支下的代码块要求再进行缩进,假设循环和分支里又嵌套了循环和分支,代码块应该层层缩进

2.if/else、while、do/while、for、switch这些可以带语句块的语句,语句块的{和}应该和关键字写在一起,用空格隔开,而不是单独占一行。

例如应该这样写:

if␣(...)␣{

→语句列表

}␣else␣if␣(...)␣{

→语句列表

}

更多的人习惯这样写:

If ␣(…)

{

→语句列表

}

else if ␣(…)

{

→语句列表

}

内核的写法和[K&R]一致,好处是不必占用太多空行,使得一屏能显示更多代码。这两种写法用得都很广泛,只要在同一个项目中能保持统一就可以了。

3.函数定义的{和}单独占一行,这一点和语句块的规定不同.

例如 :

int sum(int a, int b)

{

语句列表;

}

4. switch和语句块里的case、default对齐写,也就是说语句块里的case、 default相对于switch不往里缩进。

例如:

switch(…) {

case ‘A’:

语句列表;

case ‘B’:

语句列表;

default:

语句列表;

}

5.一行只写一条语句

6.代码中每个逻辑段落之间应该用一个空行分隔开。例如每个函数定 义之间应该插入一个空行,头文件、全局变量定义和函数定义之间也应该插入空行.

7.在分支和循环中不管有一条还是多条语句建议都要加上“{}”

注释

1.单行注释应采用/*␣comment␣*/的形式,用空格把界定符和文字分开。

2.整个源文件的顶部注释。说明此模块的相关信息,例如文件名、作者和版本历史等,顶头写不缩进。

3.相对独立的语句组注释。对这一组语句做特别说明,写在语句组上侧,和此语句组之间不留空行,与当前语句组的缩进一致。注意,说明语句组的注释一定要写在语句组上面,不能写在语句组下面。

4.代码行右侧的简短注释。对当前代码行做特别说明,一般为单行注释,和代码之间至少用一个空格隔开,一个源文件中所有的右侧注释最好能上下对齐。

标识符的命名规范

标识符的命名要清晰明了,可以使用完整的单词和大家易于理解的缩写。短的单词可以通过去元音形成缩写,较长的单词可以取单词的头几个字母形成缩写,也可以采用大家基本认同的缩写。例如count写成cnt,block写成blk,length写成len,window写成win,message写成msg,temporary可以写成temp,也可以进一步写成tmp。

内核风格规定变量、函数和类型采用全小写加下划线的方式命名,常量(宏定义和枚举常量)采用全大写加下划线的方式命名。如函数名radix_tree_insert、类型名struct radix_tree_root。

常量的命名规范:每一个英文字符大写 ,每个单词之间可以用‘_’连接 RADIX_TREE_MAP_SHIFT等。

标签的命名规范

要求有一定的描述性,顶端左对齐

全局变量和全局函数的命名一定要详细,不惜多用几个单词多写几个下划线,例如函数名radix_tree_insert,因为它们在整个项目的许多源文件中都会用到,必须让使用者明确这个变量或函数是干什么用的。局部变量和只在一个源文件中调用的内部函数的命名可以简略一些,但不能太短,不要使用单个字母做变量名,只有一个例外:用i、j、k做循环变量是可以的。

针对中国程序员的一条特别规定:禁止用汉语拼音作为标识符名称,可读性极差。

函数的编码风格

每个函数都应该设计得尽可能简单,简单的函数才容易维护。应遵循以下原则:

实现一个函数只是为了做好一件事情,不要把函数设计成用途广泛、面面俱到的,这样的函数肯定会超长,而且往往不可重用,维护困难。

函数内部的缩进层次不宜过多,一般以少于4层为宜。如果缩进层次太多就说明设计得太复杂了,应该考虑分割成更小的函数来调用。

函数不要写得太长,建议在24行的标准终端上不超过两屏,太长会造成阅读困难,如果一个函数超过两屏就应该考虑分割函数了。

执行函数就是执行一个动作,函数名通常应包含动词,例如get_current、radix_tree_insert。

比较重要的函数定义上面必须加注释,说此函数的功能、参数、返回值、错误码等。

另一种度量函数复杂度的办法是看有多少个局部变量,5到10个局部变量就已经很多了,局部变量再多就很难维护了,应该考虑分割函数。

函数参数的防错设计

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。

在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。

在函数的入口处,使用断言检查参数的有效性(合法性)。

assert(表达式)的意思是:当表达式为真时,程序继续运行,如果表达市为假,那程序就会停止运行,并提示错误信息。

#include <stdio.h>

#include <assert.h>

void test(char *p)

{

assert(p != NULL)

printf("p=%s\n",p)

}

程序说明:由于我们在main函数中传了NULL指针值给test函数,在test函数执行到assert(p != NULL)发现表达式不为真,就终止了程序的运行,并提示错误的行数信息。

注意:由于assert是一个宏,只在debug版本中起作用,所以assert一般只用于内部函数对参数有效性进行检查,如果该函数作为一个外部接口来使用时,一般需要利用if,else语句进行防错设计。

函数注释:说明此函数的功能、参数、返回值、错误码等,写在函数定义上侧,和此函数定义之间不留空行,顶头写不缩进。

/*-------------------------------------------------

function:判断分数格式是否正确

params:score 客户输入的分数

returns:1 分数格式正确 0 分数格式错误

-------------------------------------------------*/

int IsValidScore(char *score)

{

/*……*/

}

函数内的注释要尽可能少用。注释只是用来说明你的代码能做什么(比如函数接口定义),而不是说明怎样做的,只要代码写得足够清晰,怎样做是一目了然的,如果你需要用注释才能解释清楚,那就表示你的代码可读性很差,除非是特别需要提醒注意的地方才使用函数内注释。

编程好习惯

初始化变量

尽可能使用局部变量

一个函数只有一个紧凑的职责

避免函数过长避免函数嵌套过深

不要拘泥于小节

……

[root@iZ259r7h4pfZ ~]# printf "%-5s %-10s %-4s\n" NO Name Mark

NOName Mark

[root@iZ259r7h4pfZ ~]# printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456

01Tom90.35

[root@iZ259r7h4pfZ ~]# printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345

02Jack 89.23

[root@iZ259r7h4pfZ ~]# printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323

03Jeff 98.43

%-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐。 %-4.2f 格式为左对齐宽度为4,保留两位小数。

echo -e "\033[30m 黑色字 \033[0m"

echo -e "\033[31m 红色字 \033[0m"

echo -e "\033[32m 绿色字 \033[0m"

echo -e "\033[33m 黄色字 \033[0m"

echo -e "\033[34m 蓝色字 \033[0m"

echo -e "\033[35m 紫色字 \033[0m"

echo -e "\033[36m 天蓝字 \033[0m"

echo -e "\033[37m 白色字 \033[0m"

echo -e "\033[4037m 黑底白字 \033[0m"

echo -e "\033[4137m 红底白字 \033[0m"

echo -e "\033[4237m 绿底白字 \033[0m"

echo -e "\033[4337m 黄底白字 \033[0m"

echo -e "\033[4437m 蓝底白字 \033[0m"

echo -e "\033[4537m 紫底白字 \033[0m"

echo -e "\033[4637m 天蓝底白字 \033[0m"

echo -e "\033[4730m 白底黑字 \033[0m"

控制选项说明 :

\33[0m 关闭所有属性

\33[1m 设置高亮度

\33[4m 下划线

\33[5m 闪烁

\33[7m 反显

\33[8m 消隐

\33[30m -- \33[37m 设置前景色

\33[40m -- \33[47m 设置背景色

\33[nA 光标上移n行

\33[nB 光标下移n行

\33[nC 光标右移n行

\33[nD 光标左移n行

\33[yxH设置光标位置

\33[2J 清屏

\33[K 清除从光标到行尾的内容

\33[s 保存光标位置

\33[u 恢复光标位置

\33[?25l 隐藏光标

\33[?25h 显示光标

合起来一起用

# printf "\033[133m Hello World. \033[0m \n"

Hello World.

# printf "\033[133m %-5s %-10s %-4.2f\033[0m\n"03 Jeff 98.4323

Jeff 98.43230.00


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8180719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存