C/C++中变量及函数命名的讨论

来源:互联网 发布:微软远程桌面 mac 编辑:程序博客网 时间:2024/05/16 06:44

一、命名法
    在编程时为提高程序的可读性及易维护性,降低程序的维护、升级成本,在程序代码的书写时除了要注意格式外还要注意变量的命名,现在流行的有两种命名法,一种是流行于Window编程(主要是由于微软的影响)的匈牙利命名法。
    据说这种命名法是一位叫 Charles Simonyi 的匈牙利程序员发明的,后来他在微软呆了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。现在,大部分程序员不管自己使用 什么软件进行开发,或多或少都使用了这种命名法。这种命名法的出发点是把量名变按:属性+类型+对象 描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解,下面是HN变量命名规范,其中也有一些是我个人的偏向:
属性部分
全局变量 g_
常量 c_
c++类成员变量 m_
静态变量 s_
类型部分
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字 dw
字符串 sz
短整型 n
双精度浮点 d
计数 c(通常用cnt)
字符 ch(通常用c)
整型 i(通常用n)
字节 by
字 w
实型r
无符号 u
描述部分
最大 Max
最小 Min
初始化Init
临时变量 T(或Temp, Tmp)
源对象 Src
目的对象Dest (或Dst
这里顺便写几个例子:
hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄;
pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示
指向 EatApple 函数的函数指针变量。
g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类
型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
上面就是HN命名法的一般规则。
    另外一种命名法流行于Linux/Unix系统的编程者中间,不是用大小写区分各个词,而是通过下划线"_"来分割,如print_char(),send_a_byte。这种方法有好处就是不用区分大小写,因为全部用小写,但是由于每一个词之间都有一个下划线,就增长了变量、函数名的长度。

    这两种命名法可以根据个人爱好选择。
二、作用域与变量命名
    在使用变量时为了方便可以给变量名加上前缀,如上述匈牙利命名法中的i,c,l等用于区分变量是int,char,long型,但如果一个函数中用到了全局变量还用到了局部变量,当然可以通过加前缀来实现,如g_表示全局,l_表示局部变量 m_表示类成员,但也可以采用不同的命名法来实现。如全局变量用匈牙利命名法,局部变量则采用加下划线的方式,这样一看到变量也能马上区分出是全局变量还是局部变量。

三、命名的几点建议
变量或函数名采用有意义的英文单词、词组或者缩写表示,并且整个函数名的首字母大写,而变量名首字母小写。如PutChar(), iTimeCounter, tmpCounter, SaveSettings(), ChkBuff()等。
全局变量加前缀指示数据类型,并加前缀g,整个函数内均有效的局部变量加l,且带数据类型,如果一个局部变量仅用于很小的范围内,如仅用于一个for循环中,可以不加任何前缀,并且用简短的变量名,如:
glSysClk, gipCounter(int型指针做全局变量)
...
{ int i;
  for(i=0; i<5; i++){
   ...
  }
}
...
for(int i=0; i<5; i++){
...
}
变量及函数分组命名,加前缀。全局函数加组名,静函数可以不加组名。如一组堆栈管理函数StkPush(),StkPop(), StkClr(), StkGetLength()