znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
阅读:1369回复:6

语言书写规范

楼主#
更多 发布于:2001-10-16 10:52
我做C语言底层开发,积累了一些代码书写的经验供大家参考:

1.C语言书写规范

1.1符号命名规则
1.1.1符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下:
       (1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线隔开每个词。
       (2)复合词中每个单词的第一个字母大写。除了规则5.1.1.1以外,避免使用下划线。
       (3)类、类型定义和枚举型名的第一个字母大写。
       (4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。
       (5)循环变量可采用i, j, k等,不受上述规则限制。
       (6) 类的成员变量应采用m_开头。
       (7) 全局变量词头为g_ 。
       (8) 临时变量词头为tmp_ 。
       (9) 对结构体内的变量命名, 遵循变量的具体含义命名原则
       (10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。  
表   1
词 头 类 型 词 头 类 型
ch char l long
i integer u unsigned
b boolean p pointer
f float lp long pointer
d double s string
st structure sz ASCII string
by byte n short int
H handle x,y 分别为x,y坐标
dw DWORD fn function

表   2
词 头 变 量 名 词 头 变 量 名
task task sig signal
sb binary semaphores wd watchdog
sm mutual exclusion
semaphores tm timer
sc counting semaphores msg message
pipe pipe  
例:
#define ARRAY_SIZE 24  /*规则5.1.1.1*/

int g_iFlag;
class MyClass  /*规则5.1.1.3*/
{
};

void someFunc( ) /*规则5.1.1.2和5.1.1.4*/
{
.2.
Q/ECC/BJ 010―2001

 int nArray[ARRAY_SIZE];
  unsigned char uchByte;
 char szName[ ];
 char *pszName = szName;
}
      (11)有些词头(如p和u)可以和其它词头组合。

例:WDOG_ID  wdId;
        WDOG_ID g_wdId;  /*全局watchdog Id,故以g_开头*/
1.1.2名字的长度一般不要过长或过短。过长的名字会增加工作量,使程序逻辑流程变得模糊;过短的名字无法表达符号的实际意义。约定长度范围:3-31;


1.2数据和函数说明
1.2.1数据说明次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护。说明的先后次序应固定,应按逻辑功能排序,逻辑功能块内建议采用下列顺序:整型说明、实型说明、字符说明、逻辑量说明。
1.2.2如果设计了一个复杂的数据结构,应当通过注释对其变量的含义、用途进行说明。
1.2.3在函数的声明中使用异常声明。
如:void f() throw(toobig, toosmall, divzero);
在声明一个函数时,将它所抛出的异常列出,便于函数的使用者了解可能会发生哪些异常。

1.3  程序注释
1.3.1程序注释是程序员与日后的程序读者之间通信的重要手段之一,注释分为文件注释、函数注释和功能注释。
1.3.2正规程序的注释应注意:
  ――注释行的数量占到整个源程序的1/3到1/2。
1.3.3文件注释位于整个源程序的最开始部分,注释后空两行开始程序正文。它包括:
――程序标题。
――目的、功能说明。
――文件作者、最后修改日期等说明。
例:
./********************************************************************
(空一行)
        标题:  Demo.c
功能:  测试VxWorks的各种系统调用.                
说明:
    该程序测试各种VxWorks的系统调用函数。包括任务(taks)的创建、挂起及任务间通过信号灯实现同步,通过消息队列进行通讯。
    程序创建了两个任务:一个高优先级的任务和一个低优先级的任务。两个任务间通过一个二进制的信号灯进行同步,通过消息队列进行通讯。
当前版本: x.x
修改信息: 2000.06.05   John, Initial Version
           2000.07.05   Tom,  Bug xxxx  fixed
**************************************************************/
(空2行,开始程序正文)

1.3.4  函数注释通常置于每函数或过程的开头部分,它应当给出函数或过程的整体说明对于理解程序本身具有引导作用。一般包括如下条目:
 ――模块标题。
 ――有关本模块功能和目的的说明。
 ――调用格式
 ――接口说明:包括输入、输出、返回值、异常。
 ――算法。如果模块中采用了一些复杂的算法。
例:
file://(注释开头应和上一函数空两行)
(注释开头与上一函数最后一行间隔两行)
/********************************************************************
标题:assignmentComplete
功能:BSC=>MSC消息生成函数,生成assignment_complete指配完成消息(BSMAP消息) .
格式:
    int assignmentComplete(int iCellId, int iServiceChannnelNum, char *pszMSGData) throw(exception1, exception2)
    输入:
     int iCellId: MS所在的小区识别
    iCellId取值:0x00-――0xff                                .4.
Q/ECC/BJ 010―2001

          int iServiceChannnelNum:MS所占的业务信道号码
输出:
   char * pszMSGData:指配完成消息数据
返回值:  0x00正常
异常:exception1异常情况1, exception2异常情况2
********************************************************************/
   ( 注释后直接开始程序正文,不空行。)
1.3.5功能性注释嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。而不要解释下面怎么做,因为解释怎么做常常与程序本身是重复的。
例:
/*把 amount 加到 total中*/
total = amount + total;
   这样的注释仅仅是重复了下面的程序,对于理解它的工作并没有什么作用。而下面的注释,有助于读者理解。
/*将每月的销售额amount加到年销售额total中*/
total = amount + total;
1.4 函数编写应尽可能短小精悍,一般不超过两屏,以便于调试和理解。

1.5语句结构
    为保证语句结构的清晰和程序的可读性,在编写软件程序时应注意以下几个方面的问题:
――在一行内只写一条语句,并采用空格、空行和移行保证清楚的视觉效果。
――每一个嵌套的函数块,使用一个TAB缩进(可以设定为4个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对:
如,有一段程序如下:
for(i=1;i<n-1;i++){ t=1; for(j=i+1;j<n;j++){
if(a[j]<a[t] ) t=j; if(t!=i ){work=a[t];a[t]=a[I];a[I]=work;}}}
应写为
for( i=1; i<n-1; i++)
{
  t=1;
  for(j = i+1; j<n; j++)
  {
   if(a<a[j])
           t=j;
   if(t!=1)
{                                                 .5.


Q/ECC/BJ 010―2001
work=a[t];
a[t]=a;
a=work;
              }
         }
  }

――文件之中不得存在无规则的空行,比如说连续十个空行。
一般来讲函数与函数之间的空行为2-3行;
在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。
   ――程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。
――每行长度尽量避免超过屏幕宽度,应不超过80个字符。
――除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。
――尽可能使用函数库。
――尽量用公共过程或子程序去代替重复的功能代码段。要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。
――使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=a*b/c*d 写成 x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。
――避免不必要的转移。
――避免采用过于复杂的条件测试。
――避免过多的循环嵌套和条件嵌套。
――建议不要使用 *=,^=, /=等运算符。
――一个函数不要超过200行。一个文件应避免超过2000行。
――尽量避免使用go to语句。
――避免采用多赋值语句,如x = y = z ;
――不鼓励采用?:操作符,如z = (a>b)?a:b;
――不要使用空的if else 语句。如
if(cMychar >= ‘A’)
 if(cMychar <= ‘Z’)
 printf(“This is a letter \n”);
else
printf(“This is not a letter \n”);
else到底是否定哪个if容易引起误解。可通过加{}避免误解。
――尽量减少使用“否定”条件的条件语句。如:
把 if( !( (cMychar<’0’) || (cMychar>’9’) ) )
  改为if( (cMychar>=’0’) && (cMychar<=’9’) )



最新喜欢:

jmzz003jmzz00...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
dolphin
驱动中牛
驱动中牛
  • 注册日期2001-04-30
  • 最后登录2013-03-08
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-10-16 13:48
   SAVE!!!!
[b]弃我去者昨日之日不可留,乱我心者今日之日多烦忧。[/b]
dahello
驱动中牛
驱动中牛
  • 注册日期2001-06-16
  • 最后登录2004-06-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-10-16 20:10
板主真好呀!save!
不懂就问 :D
南天灵
驱动牛犊
驱动牛犊
  • 注册日期2001-12-02
  • 最后登录2003-02-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-15 14:40
收藏。
谢谢!
oyp
oyp
驱动牛犊
驱动牛犊
  • 注册日期2002-01-23
  • 最后登录2011-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-02-01 15:50
值得学习!!!
lvwj
驱动老牛
驱动老牛
  • 注册日期2001-08-21
  • 最后登录2021-01-31
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望181点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-02-01 20:21
好!
www.bjjcz.com
Turbo
驱动牛犊
驱动牛犊
  • 注册日期2002-02-05
  • 最后登录2009-01-12
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-02-05 15:47
good
游客

返回顶部