C/C++变量命名规范

来源:互联网 发布:88端口怎么起 编辑:程序博客网 时间:2024/05/19 13:19

类中的数据变量名

    m_(前缀,后面介绍)(有意义名字)



总结书


1>c:\users\administrator\desktop\c++_test_project\图书管理系统\图书管理系统\function.cpp(11): error C2628: “CBook”后面接“void”是非法的(是否忘记了“;”?)




变量的规范命名是为了增强代码的可读性和容易维护性。C++程序变量命名只有几条必须遵守的“死规则”,这些规则如下:

  1.变量名只能是字母(A-Z,a-z)、数字(0-9)或下画线。

  2.第一个字母不能是数字,例如2Lerver这不是一个合法的C++变量。

  3.不能是c++关键字,例如不能用class这个单词来命名一个变量。

  4.区分大小写,例如iA和ia是两个不同的变量。

理论上,在遵守了上面几条规则的前提下,所声明的变量名称都是合法的。比如下面的命名:

 

 

[cpp] view plaincopy
  1. char  xueshengming[20];     // 学生名  
  2.   
  3. char  a;                   // 命名一个整数,但变量名毫无意义  

这样的变量命名尽管是合法的,但可读性非常差。正规的软件公司,对于变量命名往往都有自己的一个推荐规范。不同公司的规范又会有一些差别。当一个程序员从一个公司跳槽到另一个公司,甚至会出现不习惯新公司代码规范的现象。

 万事万物,要是有一个统一的规范,也许程序员这个行业会少一些烦恼。俗话说得好:没有规矩,不成方圆。以下是笔者多年编码得出的变量命名的心得体会,在此总结如下,并奢望有招一日能成为行业规范。

1.变量命名的宗旨:用最短的字符表示最多的意义。

  

[cpp] view plaincopy
  1. int iPosX;     // Pos表示位置,X表示横坐标  

2.使用变量前缀

在变量前带上小写前缀可以很直观的看出变量的数据类型,而不必到变量的定义处去查看。常用的数据类型推荐变量前缀:

l 整型的前缀

 

 

[cpp] view plaincopy
  1. short sValue;   // s为short的前缀  
  2.   
  3. int iAge;       // i为int的前缀  
  4.   
  5. unsigned int uiAge;   // ui为unsigned int的前缀(两个单词的首字母)  
  6.   
  7. long lValue;     // i为long的前缀  

l 浮点型的前缀

    

[cpp] view plaincopy
  1. float fScore;     // f为float的前缀  
  2.   
  3. double dValue;       // d为double的前缀  

l 字符型的前缀

   

[cpp] view plaincopy
  1. char cChar;         // c为char的前缀  
  2.   
  3. TCHAR tcChar      // 多字节字符和Unicode字符兼容类型的前缀tc  
  4.   
  5. wchar_t  wcChar    // 宽字符前缀wc  

l 字符串的前缀

 

 

[cpp] view plaincopy
  1. char szName[30];    // sz为C语言字符串的前缀  
  2.   
  3. string strName;      // str为C++字符串变量的前缀  
  4.   
  5. CString strInfo;     // str为MFC字符串变量的前缀  

l 布尔型的前缀

   

[cpp] view plaincopy
  1. bool bPass;         // b为bool的前缀  

l 指针型的前缀

   

[cpp] view plaincopy
  1. int * pValue;       //p为指针的前缀  

说明:由于指针是指向一定数据类型的变量,因此p后面要不要再加一个前缀一直让我举棋不定。如果再加上前缀比如:
   

[cpp] view plaincopy
  1. int * piKey;    
  2.   
  3. char * pszInfo;  

这样似乎意义更完整,但势必会增加变量的字符长度。因此,这里就不硬性规定了。但是,指正变量以p开头应该是雷也打不动的。

l 数组的前缀

   

[cpp] view plaincopy
  1. int arrNum[10];  // arr为数组的前缀  

         说明:和指针变量一样,arr后是否再加数组元素的数据类型前缀取决于你自己。

  

[cpp] view plaincopy
  1. string arrstrName[3];         //C++字符串数组,加上去似乎很别扭  

l 枚举变量的前缀

    

[cpp] view plaincopy
  1. enum  emWeek;   // em为枚举变量的前缀  
    

l 结构变量的前缀:t

  

[cpp] view plaincopy
  1. T_NODE  tNode;  // 结构名称以T_开头  

l 字节变量的前缀:by

  

[cpp] view plaincopy
  1. BYTE  byInfo;  

l 字变量的前缀

 

[cpp] view plaincopy
  1. DWORD  dwInfo;   // 双字  
  2.   
  3. WORD    wInfo;   // 单字  

 

 

l        字符指针的前缀

 

 

[cpp] view plaincopy
  1. LPCTSTR  ptszInfo;  // ptsz表示前缀,t表示TCHAR类型  
  2.   
  3. LPCSTR  pszInfo;  
  4.   
  5. LPSTR  pszInfo;  

l        STL容器类型前缀

  

[cpp] view plaincopy
  1. vector<int>  vecValue;    
  2.   
  3. //说明:vec表示vector容器的前缀,为了简化变量,变量体后面不再使用前缀  
  4.   
  5. list<double>  lstInfo;  
  

l        MFC绑定控件变量的前缀

 

 

[cpp] view plaincopy
  1. CEdit  m_ctlName;  // 对象变量,变量体前统一用ctl表示  
  2.   
  3. int    m_iAge;   // 值变量,变量体有表示值数据类型的前缀  

说明:由于长短指针在32位操作系统后已无区别,所以不再区分,一律以p开头,这也与指针变量以p开头的原则贴得更近。

l        矩形结构的前缀:rc

 

[cpp] view plaincopy
  1. RECT  rcClient;     
  2.   
  3. CRect  rcWin;  

l        句柄对象一律以h开头

 

[cpp] view plaincopy
  1. HWND hWndName;  
  2.   
  3. HBRUSH  hBr;  
  4.   
  5. HPEN  hPen;  
  6.   
  7. HBITMAP  hBmpBack;  

l        windows颜色类型的前缀:cr

   

[cpp] view plaincopy
  1. COLORREF crFront;     

l        windows中DC(设备上下文)类型的前缀

  

[cpp] view plaincopy
  1. CClientDC  dcClient;  

3. 类的成员变量以m_开头,后面为变量体,变量体依然要有前缀。

 

[cpp] view plaincopy
  1. int  m_iDepth;  

4. 定义一个变量,为了简化,在不影响变量意义的情况下,可以仅仅使用前缀。

 

[cpp] view plaincopy
  1. RECT  rc;  

5. 全局变量一律以g_开头,后面为变量体,变量体依然要有前缀。

 

[cpp] view plaincopy
  1. int  g_iNums;  

6. 定义结构体为了保证和C语言和C++的写法兼容性,一律采用typedef语句。

 

[cpp] view plaincopy
  1. typedef   struct  tagINFO_NODE  
  2.   
  3. {  
  4.   
  5. int  iData;  
  6.   
  7. tagINFO_NODE , ;, ; * p, Next;   
  8.   
  9.   
  10.   
  11. }T_INFO_NODE, *PT_INFO_NODE;  

7. 变量体如果是多个单词,每个单词的首字母大写。

 

[cpp] view plaincopy
  1. int iStudentAge;  

8. 在意义明确的情况下可以仅仅使用首字母命名变量可以缩短变量名。

 

 

[cpp] view plaincopy
  1. int iID;  
  2.   
  3. //说明:仅使用首字母表示变量体的前提是保证变量的意义,比如变量//iStudentAge如果声明成:  
  4.   
  5. int  iSA;  // 这样将失去意义,不可取  

9. 定义一个类使用C作为类名的前缀。

 

[cpp] view plaincopy
  1. class CStudent  
  2.   
  3. {  
  4.   
  5.     …  
  6.   
  7. }  


  • 一、命名法
        在编程时为提高程序的可读性及易维护性,降低程序的维护、升级成本,在程序代码的书写时除了要注意格式外还要注意变量的命名,现在流行的有两种命名法,一种是流行于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()
    (待续)

0 0
原创粉丝点击