编程风格

转自:https://blog.csdn.net/voidccc/article/details/37599203/

正题

一、文件结构

1.1版权版本声明

       我看过一些写的比较详细正统的头文件和定义文件的开头都有这部分。具体包括以下内容:

       1) 版权信息。

       2) 文件名称,标识符,摘要。

       3) 当前版本号,作者/ 修改者,完成日期。

       4 )版本历史信息。

image

1.2 关于头文件

       1)为了防止头文件被重复引用,应当用ifndef /define/ endif 结构产生预处理块。

       2)用#include <filename.h>  格式来引用标准库的头文件,用#include “filename .h”格式来引用非标准库的头文件。

       3)头文件中只存放“声明”而不存放“定义”。

       示例:

       #ifndef GRAPHICS_H  //  防止graphics.h 被重复引用

       #define GRAPHICS_H


       #include <math.h>    //  引用标准库的头文件

       …

       #include  “ m yheader.h”   //  引用非标准库的头文件

       …

       void Function1( …); //  全局函数声明

       …

       class Box         //  类结构声明

       {

       …

       };

       #endif

1.3 头文件作用

       1) 通过头文件来调用库功能。

       2) 头文件能加强类型安全检查。

二、程序的板式

2.1空行

       建议:

       1)在每个类声明之后、每个函数定义结束之后都要加空行。

       2)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

       实例如下图左右所示:

image

2.2 代码行

       建议:

       1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

       2)if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。

       例下图中左侧为风格良好的代码,右侧为风格糟糕的代码。

image

       3)尽可能在定义变量的同时初始化该变量,以减少安全隐患。

2.3 代码行内的空格

         1)关键字(const、virtual、inline、case、if、for、while)之后要留空格。而函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。

         2)‘(’向后紧跟,不留空格;‘)’、‘,’、‘; ’向前紧跟,不留空格。‘,’、‘; ’后接空格。

         3)二元操作符(“= ”、“+=”  “>=”、“<=”、“+ ”、“* ”、“% ”、“&&”、“|| ”、“<<”, “^ ”)前后应当加空格。 一元操作符(“! ”、“~ ”、“++”、“-- ”、“& ”)前后不加空格。

         4)对于表达式比较长的for 语句和if 语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++) 和if ((a<=b) && (c<=d))

       示例如下:

image

2.4 对齐

       1)程序的分界符‘{ ’和‘} ’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

       2){ }之内的代码块在‘{ ’右边数格处左对齐。

image

2.5 修饰符的位置

     这里的修饰符主要指 * 和 &,事实上关于它们应该靠近数据类型还是变量名,一直都有争议。将修饰符 *  靠近数据类型,例如:i nt*  x;  比较直观,但同时在某些情况下也容易引起误解(例i nt*   x, y中的y容易被误解为指针变量)。所以这里:

       建议大家在写程序时将修饰符 * 和 & 紧靠变量名。

       所以:

       int  *x,  y;  //  此处y不会被误解为指针

2.6 注释

     C 语言的注释符为“/*… * / ”。C++ 语言中,程序块的注释常采用“/*… * / ”,行注释一般采用“//… ”。注释的主要作用是:

       1)版本、版权声明;

       2)函数接口说明;

       3)重要的代码行或段落提示

       一个示例如下图所示:

image

三、命名规则

    关于变量和函数等的命名,程序员会有自己的认识和习惯,没有一种命名规则可以让所有的程序员赞同,重要的是要保持一致的风格。这个地方,比较著名的一种写法是Microsoft公司的“匈牙利”法。

       主要命名规则总结如下:

       1)类名和函数名用大写字母开头的单词组合而成。

       例如:

       class  Node;     //   类名

       class  LeafNode;    //   类名

       void  Draw(void);      //  函数名

       void  SetValue(int value); //  函数名

       2)变量和参数用小写字母开头的单词组合而成。

       例如:

       BOOL flag;

       int  drawMode;

       3)常量全用大写的字母,用下划线分割单词。

       例如:

       const int MAX = 100;

       const int MAX_LENGTH = 100;

       4)静态变量加前缀s_ (表示static)。

       例如:

       void Init(…)

       {

         static int s_initValue;  //  静态变量

        …

       }

       5)如果不得已需要全局变量,则使全局变量加前缀g_(表示global )。

       例如:

       int g_howMany People;  //  全局变量

       int g_howMuchMoney ;   //  全局变量

       6)类的数据成员加前缀m_(表示membe r ),这样可以避免数据成员与成员函数的参数同名。

       例如:

        void Object::SetValue(int width, int height)

        {

              m_width = width;

              m_height = height;

        }

       有以下共同规则:

       1. 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。用词要恰当,莫把CurrentValue 写成NowValue 。

       2. 标识符的长度应当符合“min-length && max-information”原则。即最短的程度表达最多的信息。

       3. 命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如Windows中用AddChild。而Unix 中用add_child 。

       4. 程序中不要出现仅靠大小写区分的相似的标识符。例int  x,  X; void foo(int x)和void FOO(float x)是不好的命名方式。

       5. 变量的名字应当使用“名词”或者“形容词+名词”。例float  oldValue;和float  newV alue;

       6. 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。例DrawBox(); box->Draw();

       7. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例                     int minValue; int maxValue; int SetValue(…); int GetValue(…);

原文:https://blog.csdn.net/han_xiaoyang/article/details/10473845

posted @ 2019-04-03 15:57  shenyantaoit  阅读(281)  评论(0编辑  收藏  举报