VC编程规范

基本要求
1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。
1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
1.3 尽量使用标准库函数和公共函数。
1.4 不要随意定义全局变量,尽量使用局部变量。
1.5 使用括号以避免二义性。

2.可读性要求
2.1 可读性第一,效率第二。
2.2 保持注释与代码完全一致。
2.3 每个源程序文件,都有文件头说明,说明规格见规范。
2.4 每个函数,都有函数头说明,说明规格见规范。
2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。
2.7 常量定义(DEFINE)有相应说明。
2.8 处理过程的每个阶段都有相关注释说明。
2.9 在典型算法前都有注释。
2.10 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个字节。
2.11 循环、分支层次不要超过五层。
2.12 注释可以与语句在同一行,也可以在上行。
2.13 空行和空白字符也是一种特殊注释。
2.14 一目了然的语句不加注释。
2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。
2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3 。

3. 结构化要求
3.1 禁止出现两条等价的支路。
3.2 禁止GOTO语句。
3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。
3.4 用 CASE 实现多路分支。
3.5 避免从循环引出多个出口。
3.6 函数只有一个出口。
3.7 不使用条件赋值语句。
3.8 避免不必要的分支。
3.9 不要轻易用条件分支去替换逻辑表达式。

4. 正确性与容错性要求
4.1 程序首先是正确,其次是优美
4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。
4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
4.4 所有变量在调用前必须被初始化。
4.5 对所有的用户输入,必须进行合法性检查。
4.6 不要比较浮点数的相等,
如: 10.0 * 0.1 == 1.0 , 不可靠
4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等。
4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。

5. 可重用性要求
5.1 重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。
5.2 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。
5.3 公共控件或类应建立使用模板。

附:C++ 编程规范,delphi作相应的参考
.1适用范围
本标准适用于利用Visul C++ ,Borland C++进行软件程序开发的人员.。
.2变量命名
命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意
义字符串,如果连续意义字符串仅两个,可都大写.如OK.
具体例程:
BOOL类型 bEnable;
ch * char chText
c * 类对象 cMain(对象实例)
h * Handle(句柄) hWnd
i * int
n * 无符号整型
p * 指针
sz,str * 字符串
w WORD
x,y 坐标
Char或者TCHAR类型 与Windows API有直接联系的用szAppName[10]形式否则用
FileName[10]形式,单个字符也可用小写字母表示;
Int类型 nCmdShow;
LONG类型 lParam;
UINT类型 uNotify;
DWORD类型 dwStart;
PSTR类型 pszTip;
LPSTR类型 lpCmdLine
LPTSTR类型 lpszClassName;
LPVOID类型 lpReserved
WPARAM类型 wParam,
LPARAM类型 lParam
HWND类型 hDlg;
HDC类型 hDC;
HINSTANCE类型 hInstance
HANDLE类型 hInstance,
HICON类型 hIcon;
int iTmp
float fTmp
DWORD dw*
String , AnsiString str *
m_ 类成员变量 m_nVal, m_bFlag
g_ 全局变量 g_nMsg, g_bFlag
局部变量中可采用如下几个通用变量:nTemp,nResult,I,J(一般用于循环变量)。其他资源句柄同上
.3常量命名和宏定义
常量和宏定义必须具有一定的实际意义;
常量和宏定义在#include和函数定义之间;
常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说明其作用;
资源名字定义格式:
菜单:IDM_XX或者CM_XX
位图:IDB_XX
对话框:IDD_XX
字符串:IDS_XX
DLGINIT:DIALOG_XX
ICON:IDR_XX
.4函数命名
函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 如是内部函数,只要注释其定义文件名;
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下:
void UpdateDB_Tfgd (TRACK_NAME); //Module Name :r01/sdw.c
void PrintTrackData (TRACK_NAME); //Module Name :r04/tern.c
void ImportantPoint (void); //Module Name :r01/sdw.c
void ShowChar (int , int , chtype); //Local Module
void ScrollUp_V (int , int); //Local Module
.5结构体命名
结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数据区,必须注明其所属的进程。全局数据定义只需注意其用途。
示例如下:
typedef struct
{
char szProductName[20];
char szAuthor[20];
char szReleaseDate[16];
char szVersion[10];
unsigned long MaxTables;
unsigned long UsedTables;
}DBS_DATABASE;
DBS_DATABASE GdataBase;
6 控件的命名:
用小写前缀表示类别
用小写前缀表示类别:
fm 窗口
cmd 按钮
cob combo,下拉式列表框
txt 文本输入框
lab labal,标签
img image,图象
pic picture
grd Grid,网格
scr 滚动条
lst 列表框
frm fram
7注释
原则上注释要求使用中文;
文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明;
函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;
程序中注释包括:修改时间和作者、方便理解的注释等;
引用一: 文件开头的注释模板
/******************************************************************
** 文件名:
** Copyright (c) 1998-1999 *********公司技术开发部
** 创建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述:
**
** 版 本:
**--------------------------------------------------------------------------
---
******************************************************************/
引用二: 函数开头的注释模板
/*****************************************************************
** 函数名:
** 输 入: a,b,c
** a---
** b---
** c---
** 输 出: x---
** x 为 1, 表示...
** x 为 0, 表示...
** 功能描述:
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
** 修 改:
** 日 期:
** 版本
****************************************************************/
引用三: 程序中的注释模板
/*----------------------------------------------------------*/
/* 注释内容 */
/*----------------------------------------------------------*/
8 程序
a. 程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。
b. 编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程序编写时一并拟好。
c. 注释一定要与程序一致。
d. 版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。
e. 程序中每个block 的开头 ”{" 及 "}” 必须对齐,嵌套的block 每进一套,缩进一个tab,TAB 为4个空格,block类型包括if、for、while、do等关键字引出的。
f. 对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能,举例如下

count.divisor = 1193280 / freq; // compute the proper count
OutByte((unsigned short)67, (unsigned char)182); // tell 8253 that a
count is coming
OutByte((unsigned short)66, count. c[0]); // send low-order byte
OutByte((unsigned short)66, count. c[1]); // send high-order byte
×××××××××××××××××××××××××××××××××××××××
bcb,delphi中的变量命名:
遵循匈牙利命名法,命
名必须有意义,制定如下规定
窗体: 以大写的W开始,如About版权窗体, 命名为WAbout
文件:以大写的F开始,如About版权窗体,文件命名为FAbout.cpp
按钮(Button):如退出按钮,命名为btnExit
……
基类: 加base标记,如报表基类,窗体命名为:WBaseRep, 文件命名为FBaseRep.cpp 

 

 

 

 

 

 

 

 

 
Visual   C++   编程风格守则  
   
     
   
  1               引言  
  1.1         本文目的  
  随着越来越多的项目需要Visual   C++来编写,为了便于各位项目经理、程序员之前交流项目源程序,并且保证源程序的可读性,特制定本《编程风格守则》,本文的读者为项目经理、程序员,以期在编码过程之中,保持一致的风格,有利于软件工程项目的推行。本文在编写上力求求大同、存小异,在编程风格上分为两类,一类为强制风格,意为一定需要遵守,一类为推荐风格,意为希望程序员在编码时按照这样的风格。  
   
  1.2         背景  
  在软件工程领域,源程序的风格统一标志着可维护性、可读性,是软件项目的一个重要组成部分。而目前还没有成文的编码风格文档,以致于很多时候,程序员没有一个共同的标准可以遵守,编码风格各异,程序可维护性差、可读性也很差。  
   
  目前在编码上也有许多相关的风格约定,包括匈牙利命名法(一种变量的取名办法)、类MFC取名方式,但是针对基于某种编译器的项目完整编程风格守则,目前还是比较少,或者说比较零散。  
   
  1.3         术语  
  系统:指一个软件工程项目,是一个系统;  
   
  项目:指一个Visual   C++项目;  
   
  Hungarian   naming:  
   
  MFC:Microsoft   Foundation   Class   Library;  
   
  1.4         参考资料  
  MSDN中有关MFC编写风格的文章,互联网上一些有关编写风格的资料(http://www.cs.clemson.edu/~kjhay/CpSc372/Week3/Week3.PPT)。  
   
  2               概述  
  每位程序员都有自己的编程风格,因为每位程序员都有自己的学习过程,就象每个人的个性一样,所以编程风格是风彩各异、百花齐放;而从软件工程理论、实践来看,现代软件是多人合作的结晶,编程风格是否统一,直接关系到软件项目的可读性、可维护性、培训,继而对软件开发成本有着直接的关系,编程风格一致,软件项目易培训,其它人员接手老项目的时间缩短,便于程序员之间的交流。编程风格混乱,则其它人员接手老项目时间增长,同时随着项目的不断开发,项目或者单个源程序文件内有着多种编程风格,这样不利于整个项目的开展以及程序员之间的交流。  
   
  本文在参考业界已有的编码风格的基础上,描述了一个基于Visual   C++编译器的项目风格,力求一种统一的编程风格,并从项目风格、代码文件风格、函数编写风格、变量风格、注释风格几个方面进行阐述。  
   
  3               项目风格  
  项目风格指的是针对整个项目,包括项目目录设置、相关库文件设置、Visual   Studio集成环境设置等等的习惯约定。具体有如下风格守则:  
   
  3.1         项目取名  
  在VC之中,项目名为最后可执行文件名,所以项目名最好以最终的可执行文件名一致。  
   
  3.2         项目目录设置  
  为保证VC项目的备份方便、快捷,可将所有该项目有关的文件全部放到统一的目录之下,为每个项目在该目录之下建立一个目录,项目之间的公共部分建立在public目录之下,项目所需要的基础库根据所需要的基础库数目分别建立不同的目录,项目相关的测试程序都统一放在TEST目录之下。下表显示了一个软件工程PSS系统的目录设置表:  
   
  PSS系统简介:  
   
  PSS系统有两个模块PSS_mod1和PSS_mod2,两个模块有一部分共用代码,在工程开发过程之中编写了三个测试程序PSS_TEST1、PSS_TEST2、PSS_TEST3,PSS系统开发过程之中用到了第三方公用模块Third_Mod,则该系统的目录设置如下:  
   
  一级目录  
    二级目录  
    三级目录  
    备注  
     
  WORK  
    PSS_mod1  
    Debug  
    VC集成环境生成的调试版本目录  
     
  Release  
    VC集成环境生成的发行版本目录  
     
  Res  
    VC集成环境生成的资源文件目录  
     
  Include  
    所属mod1的头文件  
     
  Source  
    所属mod2的头文件  
     
  PSS_mod2  
    Debug  
    VC集成环境生成的调试版本目录  
     
  Release  
    VC集成环境生成的发行版本目录  
     
  Res  
    VC集成环境生成的资源文件目录  
     
  Include  
    所属mod1的头文件  
     
  Source  
    所属mod2的头文件  
     
  PUBLIC  
    Include  
    Mod1和mod2公用的头文件  
     
  Source  
    Mod1和mod2公用的源代码文件  
     
  Lib  
    Mod1和mod2公用的库文件  
     
  TEST  
    PSS_Test1  
    测试项目一  
     
  PSS_Test2  
    测试项目三  
     
  PSS_Test3  
    测试项目三  
     
  Third_Mod  
       
    第三方公用模块  
     
   
  3.3         集成环境内的项目目录设置  
  每个项目在VC编成编辑环境的设置都采用相对路径的设置,不可采用绝对路径,保证其备份到光盘设备后,恢复到硬盘后,不需要再过多的设置就可直接编译。同样在用#include   语句时不要太多的目录搜索,如下所示:  
   
  #include   “../../../somehead.h”  
   
  改成:  
   
  #include   “somehead.h”  
   
  然后在项目设置(Project   Setting)中加入该头文件的所在目录。  
   
  3.4         集成环境内的模块划分  
  在VC项目集成环境之下,Project视图中的FileView视图,对于每个项目的子模块都建立相应的文件夹,以对不同的子模块进行区分,比如说PSS_mod1就可建立如下几个模块:  
   
  核心数据结构、底层通用平台、界面处理模块、底层工作线程,其中底层通用平台又可划分为CJ60开发包、RCC通讯平台等等。  
   
     
   
  3.5         项目修改记录追踪  
  每一个VC项目必须存在Changes.Log,用以记载项目产生以来所有的改动,其格式必须如下:  
   
  日期:                     2000/4/28  
   
  修改人:               程旷  
   
  修改主题:                 底层通讯由于MODEM响应代码而引起的不稳定现象  
   
  相关修改文件:   CommLayer.cpp  
   
  修改内容详细描述:  
   
     
   
  另外充分利用Visual   C++自动生成的Readme.txt文件来记载项目相关的信息。  
   
  4               文件风格  
  4.1         文件生成  
  对于规范的VC派生类,尽量用Class   Wizard生成文件格式,避免用手工制作的头文件/实现文件。  
   
  无论是MFC源文件还是由App   Wizard生成的文件,会发现在这些类中有以下注释;  
   
  //   Constructors  
  //   Attributes  
  //   Operations  
  //   Overridables  
  //   Implementation  
  每一次类都至少有一个//Implementation,在不同的位置MFC做不同的处理,在编写代码时最好与MFC这种风格一致。  
   
  4.2         文件头部注释  
  文件头部注释主要是表明该文件的一些信息,其格式如下:  
   
  ///////////////////////////////////////////////////////////////////////////////////////////  
   
  //   文件名:  
   
  //   创建者:  
   
  //   创建时间:  
   
  //   内容描述:  
   
  ///////////////////////////////////////////////////////////////////////////////////////////  
   
     
   
  4.3         空行约定  
  文件之中不得存在无规则的空行,比如说连续十个空行,一般来讲函数与函数之前的空行为2-3行,在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。  
   
     
   
  4.4         文件规格化功能键  
  源文件在编写完毕时,Visual   C++提供Alt+F8功能键,进行文件规格化,常使用该按键可使得文件保持规格化(注,Alt+F8功能键对连续两个CASE语句则会发生处理错误,不能规格化)。  
   
  5               函数风格  
  5.1         函数注释  
  ClassWizard自动生成的函数,如消息响应函数,则不必太多的注释和解释;  
   
  对于自行编写的函数,若是系统关键函数,则必须在函数实现部分的上方标明该函数的信息,格式如下:  
   
  ///////////////////////////////////////////////////////////////////////////////////////////  
   
  //   函数名:  
   
  //   编写者:  
   
  //   参考资料:  
   
  //   功     能:  
   
  //   输入参数:  
   
  //   输出参数:  
   
  //   备     注:  
   
  ///////////////////////////////////////////////////////////////////////////////////////////  
   
  5.2         代码缩进  
  每一个嵌套的函数块,使用一个TAB缩进(可以设定为3个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对:  
   
  if(condition)  
   
  {  
   
                while(condition)  
   
                {  
   
                }  
   
  }  
   
  6               变量风格  
  变量尽量采用匈牙利命名法,同时结合VC的原则;一般情况下,变量的取名方式为:  
   
  <scope><prefix><   qualifier  
   
  >  
   
  有关项目的全局变量必须用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。  
   
  前缀  
    类型  
    例子  
     
  g_  
    Global   Variable  
    g_Servers  
     
  C  
    Class   or   structure  
    CDocument,   CPrintInfo  
     
  m_  
    Member   variable  
    m_pDoc,   m_nCustomers  
     
   
     
   
  Visual   C++常用前缀列表:  
   
  前缀  
    类型  
    描述  
    例子  
     
  ch  
    char  
    8-bit   character  
    chGrade  
     
  ch  
    TCHAR  
    16-bit   character   if   _UNICODE   is   defined  
    chName  
     
  b  
    BOOL  
    Boolean   value  
    bEnabled  
     
  n  
    int  
    Integer   (size   dependent   on   operating   system)  
    nLength  
     
  n  
    UINT  
    Unsigned   value   (size   dependent   on   operating   system)  
    nLength  
     
  w  
    WORD  
    16-bit   unsigned   value  
    wPos  
     
  l  
    LONG  
    32-bit   signed   integer  
    lOffset  
     
  dw  
    DWORD  
    32-bit   unsigned   integer  
    dwRange  
     
  p  
    *  
    Ambient   memory   model   pointer  
    pDoc  
     
  lp  
    FAR*  
    Far   pointer  
    lpDoc  
     
  lpsz  
    LPSTR  
    32-bit   pointer   to   character   string  
    lpszName  
     
  lpsz  
    LPCSTR  
    32-bit   pointer   to   constant   character   string  
    lpszName  
     
  lpsz  
    LPCTSTR  
    32-bit   pointer   to   constant   character   string   if   _UNICODE   is   defined  
    lpszName  
     
  h  
    handle  
    Handle   to   Windows   object  
    hWnd  
     
  lpfn  
    (*fn)()  
    callbackFar   pointer   to   CALLBACK   function  
    lpfnAbort  
     
   
     
   
  Windows对象名称缩写:  
   
  Windows   对象  
    例子变量  
    MFC类  
    例子对象  
     
  HWND  
    hWnd;  
    CWnd*  
    pWnd;  
     
  HDLG  
    hDlg;  
    CDialog*  
    pDlg;  
     
  HDC  
    hDC;  
    CDC*  
    pDC;  
     
  HGDIOBJ  
    hGdiObj;  
    CGdiObject*  
    pGdiObj;  
     
  HPEN  
    hPen;  
    CPen*  
    pPen;    
     
  HBRUSH  
    hBrush;  
    CBrush*  
    pBrush;    
     
  HFONT  
    hFont;  
    CFont*  
    pFont;    
     
  HBITMAP  
    hBitmap;  
    CBitmap*  
    pBitmap;    
     
  HPALETTE  
    hPalette;  
    CPalette*  
    pPalette;    
     
  HRGN  
    hRgn;  
    CRgn*  
    pRgn;    
     
  HMENU  
    hMenu;  
    CMenu*  
    p

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓