程序的版式虽然不会影响其功能,但会影响可读性。程序的版式追求清晰,美观,是构成程序风格的重要因素。
下面介绍一下C/C++代码的好风格。
1.空行
规则1.1:在每个类声明之后、每个函数定义结束之后都要加空行。
规则1.2:在一个函数体内,逻辑上密切相关的语句之间不加空行,其他地方加空行分隔。
1.函数之间的空行
//空行
void Function1(...)
{
...
}
//空行
void Function2(...)
{
...
}
//空行
void Function3(...)
{
...
}
2.函数内部的空行
//空行
while(condition)
{
statement1;
//空行
if(condition)
{
statement2;
}
else
{
statement3;
}
//空行
statement4;
}
2.代码行
规则2.1:一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
规则2.2:if 、for while 、do 等语句自站一行,执行语句不得紧跟其后。不论执行语句有多少都要加{ }。这样可以防止书写错误。
下面有一些内容进行对比:
x = a + b; y = c + d; z = e + f;
if (width < height) { dosomething(); }
for(i = 1;i <= b; i++) { dosomething(); } //空行 other();
坏的代码风格
int width,height,depth;//宽度高度深度
x = a + b; y = c + d; z = e + f;
if (width < height) dosomething();
for(i = 1; i<=b; i++) dosomething(); other;
尽可能的在定义变量的同时初始化变量。如果变量引用和定义相聚甚远,可能导致出错,本建议可以减少隐患。如: int width=10; //宽度 int height=10; //高度 int depth=10; //深度
3.代码行内的空格
规则3.1:关键字之后要留空格。像 const 、virtual
、inline、case等关键字之后至少留一个空格,否则无法辨析关键字。if、for、while等关键字之后要留一个空格,再跟左括号 ‘ (
’ ,以突出关键字。
如果表达式过长可适当紧凑
如if((a<=b)&&(c<=d))
规则3.2: 函数名之后不要留空格,紧跟左括号 ‘ ( ’ , 以与关键字区别。
规则3.3:
‘ ( ’ 向后紧跟
’ ) ’ ’ , ’ ’ ; ’ 向前紧跟,紧跟处不留空格。
规则3.4: ’ , ’ 之后要留空格,如Function (x, y, z )。如果‘;’不是一行的结束符号,其后要留空格,如for(i = 0; i<=a; i++) 。
规则3.5:赋值操作符、比较操作符、算数操作符、逻辑操作符、位域操作符,如 “=”, “+=”,“<=”, “+”,“&&”,“<<”,
"^"等二元操作符的前后应当加空格。
规则3.6:一元操作符“~”, “ ! ”,“++”,“–”,“&”等前后不加空格
规则3.7:像 “[ ]”,“.”,“->”这类操作符前后不加空格。
void Func1(int x,int y, int z); //良好风格
void Func1 (int x,int y, int z); //不良风格
if (year >= 2000) //良好风格
if(year>=2000) //不良风格
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 ++) //过多风格
x = a < b ? a : b; //良好风格
x=a<b?a:b; //不良风格
int *x =&y; //良好风格
int * x =& y; //不良风格
arr[5] = 0; //不要写成arry[ 5 ] = 0;
a.Function(); //不要写成a . Function();
b->Function(); //不要写成b -> Function();
4对齐
" { " 与 对应的" } ",不必多讲。
5长行拆分
规则5.1:代码行最大长度控制在70~80之内,否则看不过来,也不便打印。
规则5.2:长表达式要在最低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if ((very_long_varablel>=very_longer_variable12)
&&(very_long_varable3>=very_longer_variable14)
&&(very_long_varablel>=very_longer_variable16))
{
dosomething();
}
1.6修饰符的位置
修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的话题。
规则1:应当将修饰符 * 和 & 紧靠变量名
例如:
char *name;
int *x, y; //此处y不会被误解为指针
1.7类的版式
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供了关键字 public 、protected 和private ,分别用于声明哪些数据和函数是公有的、受保护的或是私有的。这样可以信息隐藏的目的,即让类紧紧公开必须要让外界知道的内容,而隐藏其他一切内容。我们不可以滥用类的封装功能,不要把啥都往里面封装。
类的版式有两种方式:
(1)将 private 类型的数据写在前面,而将public类型的函数写在后面,这种方式是以 “ 数据为中心",重点关注类的内部结构。
(2)将public 类型的数据写在前面,而将private类型的函数写在后面,这种方式是以 “ 行为为中心",重点关注类应该提供什么样的接口(或者服务)。
建议 "以行为为中心"书写。
class A
{
private:
int i, j;
float x, j;
...
public:
void Func1(void);
void Func2(void);
...
}//以数据为中心
class A
{
public:
void Func1(void);
void Func2(void);
...
private:
int i, j;
float x, j;
...
}//以行为为中心
2命名规则
规则2.1.1:标识符最好用英语单词及其组合完成,便以记忆阅读,如NowValue.
规则2.1.2:标识符的长度应当符合 "min-length&&max-information"原则。能更好的表达意思即可。
规则2.1.3:命名规则尽量与所采用的操作系统或者开发工具的风格保持一致。 如Windows 采用大小写混排,
如AddChild,
Unix采用小写加下划线的方式,如add_child。 别把这两类风格混在一起用。
规则2.1.4:不要出现仅靠大小写区分的标识符。 如 int x,X;
void foo(int x)
void FOO(float x)
规则2.1.5:程序中尽量不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
规则2.1.6: 变量的名字应当使用 (名词) 或者( 形容词+名词) 如 float value;
float oldValue;
float newValue;
规则2.1.7:全局函数的名字应当使用 “ 动词 ”或者 “动词+名词”(动宾词组) 类的成员函数应当使用“动词”,忽略的名词就是对象本身。 如: DrawBox(); 全局函数 box->Draw();
//类的成员函数
规则2.2.8: 用正确的反义词命名具有互斥含义的变量或相反动作的函数等。 如 int minValue;
int maxValue;
int SetValue(…);
int GetValue(…);
2.2简单的Windows应用中的命名规则
规则2.2.1:类名和函数名用大写字母开头的单词组合而成。 如:
class Node; //类名
class LeafNode; //类名
void Draw(void); //函数名
void SetValue(int value);//函数名
规则2.2.2:变量名和参数用小写字母开头的单词组合而成。 如:
BOOL flag;
int drawMode;
规则2.2.3:常量全用大写的字母,用下划线分割单词。 如:
const int MAX =100;
const int MAX_LENGTH = 100;
规则2.2.4:静态变量加前缀s_(表示static)。 如:
void Init(...)
{
static int s_initValue; //静态变量
...
}
规则2.2.5:如果不得已需要全局变量,则使全局变量加前缀g_(global)。
例如:
int g_howManyPeople; //全局变量
int g_howMuchPeople; //全局变量
规则2.2.6:类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
如:
void Object::SetValue(int width, int height)
{
m_width=width;
m_height=height;
}
规则3-2-7:为了防止某一软件库中的一些标识符和其他软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图型的标准OpenGL的所有库函数均以gl开头,所定义的常量(或宏定义)均以GL开头。
以上就是一些代码的小知识,借鉴于《高质量C++/C编程指南》,有问题多指教,大家点点关🐖,希望大家多多支持!