C++编程规范总结——对美感的追求
Posted Daniel_Muei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++编程规范总结——对美感的追求相关的知识,希望对你有一定的参考价值。
本文目录
一、版权&版本声明
版权声明可以按照以下格式说明:
1、版权信息
2、文件名称,标识符,摘要
3、当前版本号,作者,完成日期
4、版本历史信息
* Copyright (c) 2021,google
* All rights reserved.
*
* 文件名称:fileName.h
* 摘 要:简要描述本文件的功能和用法
*
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:2021 年 8 月 1 日
*
* 取代版本:1.0
* 原作者 :输入原作者(或修改者)名字
* 完成日期:2021 年 8 月 1 日
二、头文件的结构
1、用 #include <filename.h>
格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
2、用 #include “filename.h”
格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
三、缩进
避免使用制表位Tab缩进,使用4个空格。
四、空行
在程序中使用空行可以使程序更加有逻辑、清晰,所以不要舍不得用空行。
具体规则:
1、在每个类声明之后、每个函数定义结束之后都要加空行。
2、在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
3、一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便写注释。
4、if、for、while、do 等语句自占一行,执行语句不得紧跟其后。
5、关键字之后要留空格。像 if、for、while 等关键字之后应留一个空格再跟左括号 ’ ( ',以突出关键字。
6、函数名之后不要留空格,紧跟左括号 ’ ( ',以与关键字区别。
7、’ , ’ 之后要留空格,如 fun(x, y, z)
;
如果 ’ ; ’ 不是一行的结束符号,其后要留空格,如
for (initialization; condition; update)
。
8、赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如 “ = ”、“ += ”、“ >= ”、“ <= ”、“ + ”、“ * ”、“ % ”、“ && ”、“ || ”、“ << ”、“ ^ ” 等二元操作符的前后要加上空格。
9、一元操作符如 “ ! ”、“ ~ ”、“ ++ ”、“ – ”、“ & ”(地址运算符)等前后不加空格。
10、像 “[]”、“. ”、“ -> ” 这类操作符前后不加空格。
void fun(int x, int y, int z); // 良好的风格
void fun (int x,int y,int z); // 不良的风格
if ((a>=b) && (c<=d)) // 良好的风格
if(a>=b&&c<=d) // 不良的风格
for (i=0; i<10; i++) // 良好的风格
for(i=0;i<10;i++) // 不良的风格
for (i = 0; i < 10; i ++) // 过多的空格
array[5] = 0; // 不要写成 array [ 5 ] = 0;
a.Function(); // 不要写成 a . Function();
b->Function(); // 不要写成 b -> Function();
五、对齐
1、程序的分界符 ’ ’ 和 ’ ’ 应独占一行并且位于同一列,同时与引用它们的语句左对齐。
2、 之内的代码块在 ‘ ’ 右边缩进后再左对齐。
// 良好的风格
void function(int x)
doSomething();
other();
// 不良的风格
void function(int x)
doSomething();
other();
六、命名规则
1、标识符应当直观且可以拼读,且最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把 CurrentValue 写成 NowValue。
2、命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如 Windows 应用程序的标识符通常采用 “大小写” 混排的方式,如 addChild;而 Unix 应用程序的标识符通常采用 “小写加下划线” 的方式,如 add_child。别把这两类风格混在一起用。
3、程序中不要出现仅靠大小写区分的相似的标识符。
4、程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解,编程者也容易混淆。
5、变量名应当使用”名词“或者“形容词+名词”。
float value;
float oldValue;
float newValue;
6、函数名应当使用“动词”或者“动词+名词”。
drawContent(); // 普通函数
content->draw(); // 类的成员函数
7、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
int minValue;
int maxValue;
int SetValue();
int GetValue();
8、尽量避免名字中出现数字编号,如 Value1
,Value2
等,除非逻辑上的确需要编号。
9、除非缩写放到项目外也非常明确,否则不要使用缩写。
10、文件命名使用 “小驼峰命名法”,除第一个单词之外,其他单词首字母大写。
lockScreen.h
changePasswd.cpp
11、结构体、类型定义(typedef)、枚举等所有类型,均使用 “大驼峰命名法”,即所有单词首字母大写。
12、无论是宏常量还是普通常量的命名,都全用大写的字母,用下划线分割单词。
13、如果不得已需要全局变量,则使全局变量加前缀 g_(表示global),即 “匈牙利+小驼峰命名法”。
七、语法比较规范
1、不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较。
// 良好的风格
if (flag) // 表示 flag 为真
if (!flag) // 表示 flag 为假
// 不良的风格
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
2、整型变量与零值比较。
// 良好的风格
if (value == 0)
if (value != 0)
// 不良的风格
if (value) // 会让人误解 value 是布尔变量
if (!value)
3、不可将浮点变量用 “==” 或 “!=” 与任何数字比较。
// 良好的风格
if ((f>=-EPSINON) && (f<=EPSINON)) // EPSINON 是允许的误差(即精度)
// 不良的风格
if (f == 0.0) // 隐含错误的比较
八、参数规范
1、参数命名要恰当,顺序要合理。
例如编写字符串拷贝函数 stringCopy
,它有两个参数。如果把参数名字起为 str1
和 str2
,例如 :
void stringCopy(char *str1, char *str2);
那么我们很难搞清楚究竟是把 str1 拷贝到 str2 中,还是刚好倒过来。可以把参数名字起得更有意义,如叫 strSource 和 strDest。这样从名字上就可以看出应该把 strSource 拷贝到 strDest。
还有一个问题,这两个参数哪那一个该在前哪一个该在后?参数的顺序要遵循程序员的习惯。一般地,应将目的参数放在前面,源参数放在后面。 如果将函数声明为:
void stringCopy(char *strSource, char *strDest);
别人在使用时可能会不假思索地写成如下形式:
char str[20];
StringCopy(str, “Hello World”); // 错误,参数顺序颠倒了
2、如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该指针在函数体内被意外修改。
void stringCopy(char *strDest,const char *strSource);
3、如果输入参数以值传递的方式传递对象,则宜改用 “const &” 方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。
4、避免函数有太多的参数,参数个数尽量控制在 5 个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。
九、函数功能设计
1、函数的功能要单一,不要设计多用途的函数。
2、函数体的规模要小,尽量控制在 50 行代码之内。
3、尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。(如C++中的 static 局部变量就有记忆功能,应尽量减少使用)
4、不仅要检查输入参数的有效性,还要检查通过其它途径进入。
十、注释
1、C++中,程序块的注释常采用 “/* … */”
,行注释一般采用 “//…”
。
2、每个类的定义要添加描述类的功能和用法的注释。
3、函数声明处的注释,只描述函数功能及用法,而不会描述函数如何实现,因为那是定义部分的事情。
4、每个函数定义时要以注释说明函数功能和实现要点,如使用的代码、实现的简要步骤、如此实现的理由等等。
十、其他一些小建议
1、当心那些视觉上不易分辨的操作符发生书写错误。
2、变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
3、当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。
4、当心变量发生上溢或下溢,数组的下标越界。
5、当心忘记编写错误处理程序,当心错误处理程序本身有误。
6、如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。
7、尽量使用标准库函数,不要“发明”已经存在的库函数。
8、尽量不要使用与具体硬件或软件环境关系密切的变量。
9、把编译器的选择项设置为最严格状态。
总结
合适的编程习惯不但会增强代码的可读性、美观性,还能减少错误,提高效率。先前我虽然也形成了自己的编写习惯,但还不够标准、不够完美,无法有效地降低修改代码的繁琐程度,便想到找一套现行较标准的编写规范学习弥补一下。
在大家眼里,音乐、绘画等才是艺术,编程恐怕难以被认可为艺术。但在我看来,编程即艺术,假若你的代码按照完美的编写规范去编写,在外表上实则是另一种美的体现,程序运行的过程以及最后呈现的效果无疑也是一种美,各种艺术形式都是以人类可接收的方式呈现出自身的美,那为何编程就不能称作艺术呢?这其中应该没有悖论的存在,因为这两个事物之间彼此联系,没有矛盾,却也多少带点主观性。
所以,不管怎么说,编程规范这种东西因人而异,很多程序员其实也并没有遵循上述规范写代码,这种格式化的编写规范也许真的不适合每一个人,尽管是由大师总结而来,但不一定具有普遍适用性。像我这种有点强迫症的人,便觉得这种写法Bravo!
以上是关于C++编程规范总结——对美感的追求的主要内容,如果未能解决你的问题,请参考以下文章
(转) 三种编程命名规范(匈牙利命名法驼峰式命名法帕斯卡命名法)