C++编程规范总结——对美感的追求

一、版权&版本声明

版权声明可以按照以下格式说明:
1、版权信息
2、文件名称,标识符,摘要
3、当前版本号,作者,完成日期
4、版本历史信息

* Copyright (c) 2021,google
* All rights reserved.
* 
* 文件名称:fileName.h
* 摘 要:简要描述本文件的功能和用法
* 
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:202181* 
* 取代版本:1.0
* 原作者 :输入原作者(或修改者)名字
* 完成日期:202181

二、头文件的结构

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,它有两个参数。如果把参数名字起为 str1str2,例如 :

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!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值