C语⾔编程规范—命名规则
C是⼀门朴素的语⾔,你使⽤的命名也应该这样。与Modula-2和Pascal程序员不同,C程序员不使⽤诸
如“ThisVariableIsATemporaryCounter”这样“聪明”的名字。C程序员应该叫它“tmp”,这写起来更简单,也不会更难懂。
然⽽,当⾯对复杂情况时就有些棘⼿,给全局变量取⼀个描述性的名字是必要的。把⼀个全局函数叫做“foo”是⼀种⽬光短浅的⾏为。全局函数也⼀样,如果你有⼀个统计当前⽤户个数的函数,应当把它命名为“count_active_user()”或者简单点些的类似名称,不应该命名
为“cntusr()”。
3.1 三种流⾏的命名法则
⽬前,业界共有四种命名法则:驼峰命名法、匈⽛利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流⾏的命名法。
(1)驼峰命令法。正如它的名称所表⽰的那样,是指混合使⽤⼤⼩写字母来构成变量和函数的名字。例如,下⾯是分别⽤骆驼式命名法和下划线法命名的同⼀个函数:
printEmployeePaychecks();
print_employee_paychecks();
第⼀个函数名使⽤了驼峰命名法,函数名中的每⼀个逻辑断点都有⼀个⼤写字母来标记。第⼆个函数名使⽤了下划线法,函数名中的每⼀个逻辑断点都有⼀个下划线来标记。
驼峰命名法近年来越来越流⾏了,在许多新的函数库和Microsoft Windows这样的环境中,它使⽤得当相多。另⼀⽅⾯,下划线法是C出现后开始流⾏起来的,在许多旧的程序和UNIX这样的环境中,它的使⽤⾮常普遍。
(2)匈⽛利命名法。⼴泛应⽤于象Microsoft Windows这样的环境中。Windows 编程中⽤到的变量(还包括宏)的命名规则为匈⽛利命名法,这种命名技术是由⼀位能⼲的 Microsoft 程序员查尔斯-西蒙尼(Charles Simonyi) 提出的。
匈⽛利命名法通过在变量名前⾯加上相应的⼩写字母的符号标识作为前缀,标识出变量的作⽤域、类型等。这些符号可以多个同时使⽤,顺序是先m_(成员变量)、再指针、再简单数据类型、再其它。这样做的好处在于能增加程序的可读性,便于对程序的理解和维护。
例如:m_lpszStr, 表⽰指向⼀个以0字符结尾的字符串的长指针成员变量。
匈⽛利命名法关键是:标识符的名字以⼀个或者多个⼩写字母开头作为前缀;前缀之后的是⾸字母⼤写的⼀个单词或多个单词组合,该单词要指明变量的⽤途。
(3)帕斯卡(pascal)命名法。与驼峰命名法类似,⼆者的区别在于:驼峰命名法是⾸字母⼩写,⽽帕斯卡命名法是⾸字母⼤写,如:DisplayInfo();
string UserName;
⼆者都是采⽤了帕斯卡命名法。
(4)三种命名规则的⼩结:MyData就是⼀个帕斯卡命名的⽰例;myData是⼀个驼峰命名法,它第⼀个单词的第⼀个字母⼩写,后⾯的单词⾸字母⼤写,看起来像⼀个骆驼;iMyData是⼀个匈⽛利命名法,它的⼩写的i说明了它的型态,后⾯的和帕斯卡命名相同,指⽰了该变量的⽤途。
3.2 命名的基本原则
(1)标识符的命名要清晰、明了,有明确含义,同时使⽤完整的单词或⼤家基本可以理解的缩写,避免使⼈产⽣误解——尽量采⽤采⽤英⽂单词或全部中⽂全拼表⽰,若出现英⽂单词和中⽂混合定义时,使⽤连字符“_”将英⽂与中⽂割开。较短的单词可通过去掉“元⾳”形成缩写;较长的单词可取单词的头⼏个字母形成缩写;⼀些单词有⼤家公认的缩写。例如:temp->tmp、flag->flg、statistic->stat、incre
ment->inc、message->msg等缩写能够被⼤家基本认可。
(2)命名中若使⽤特殊约定或缩写,则要有注释说明。应该在源⽂件的开始之处,对⽂件中所使⽤的缩写或约定,特别是特殊的缩写,进⾏必要的注释说明。
(3)⾃⼰特有的命名风格,要⾃始⾄终保持⼀致,不可来回变化。个⼈的命名风格,在符合所在项⽬组或产品组的命名规则的前提下,才可使⽤。(即命名规则中没有规定到的地⽅才可有个⼈命名风格)。
(4)对于变量命名,禁⽌取单个字符(如i 、j 、k... ),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i 、j 、k 作局部循环变量是允许的。变量,尤其是局部变量,如果⽤单个字符表⽰,很容易敲错(如i写成j),⽽编译时⼜检查不出来,有可能为了这个⼩⼩的错误⽽花费⼤量的查错时间。
(5)除⾮必要,不要⽤数字或较奇怪的字符来定义标识符。
(6)命名规范必须与所使⽤的系统风格保持⼀致,并在同⼀项⽬中统⼀。
(7)在同⼀软件产品内,应规划好接⼝部分标识符(变量、结构、函数及常量)的命名,防⽌编译、链接时产⽣冲突。对接⼝部分的标识符应该有更严格限制,防⽌冲突。如可规定接⼝部分的变量与常量之前加上“模块”标识等。
(8)⽤正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
下⾯是⼀些在软件中常⽤的反义词组。
add / remove begin / end create / destroy
insert / delete first / last g et / release
increment / decrement put / get
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination
cut / paste up / down
⽰例:
int min_sum;
int max_sum;
int add_user( BYTE *user_name );
int delete_user( BYTE *user_name );
(9)除了编译开关/ 头⽂件等特殊应⽤,应避免使⽤_EXAMPLE_TEST_ 之类以下划线开始和结尾的定义。
3.3 变量名的命名规则
(1)变量的命名规则要求⽤“匈⽛利法则”。
即开头字母⽤变量的类型,其余部分⽤变量的英⽂意思、英⽂的缩写、中⽂全拼或中⽂全拼的缩写,要求单词的第⼀个字母应⼤写。
即:变量名=变量类型+变量的英⽂意思(或英⽂缩写、中⽂全拼、中⽂全拼缩写)
对⾮通⽤的变量,在定义时加⼊注释说明,变量定义尽量可能放在函数的开始处。
见下表:
bool ⽤b开头 bFlg
int ⽤i开头 iCount
short int ⽤n开头 nStepCount
long int ⽤l开头 lSum
char ⽤c开头 cCount
unsigned char ⽤by开头
float ⽤f开头 fAvg
double ⽤d开头 dDeta
unsigned int(WORD) ⽤w开头 wCount
unsigned long int(DWORD) ⽤dw开头 dwBroad
字符串⽤s开头 sFileName
⽤0结尾的字符串⽤sz开头 szFileName
(2)指针变量命名的基本原则为:
对⼀重指针变量的基本原则为:“p”+变量类型前缀+命名,如⼀个float*型应该表⽰为pfStat。对⼆重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。
(3)全局变量⽤g_开头,如⼀个全局的长型变量定义为g_lFailCount。即:变量名=g_+变量类型+变量的英⽂意思(或缩写)。此规则还可避免局部变量和全局变量同名⽽引起的问题。
(4)静态变量⽤s_开头,如⼀个静态的指针变量定义为s_plPerv_Inst。即:变量名=s_+变量类型+变量的英⽂意思(或缩写)
(5)对枚举类型(enum)中的变量,要求⽤枚举变量或其缩写做前缀。并且要求⽤⼤写。如:
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};
(6)对struct、union变量的命名要求定义的类型⽤⼤写。并要加上前缀,其内部变量的命名规则与变量命名规则⼀致。
结构⼀般⽤S开头,如:
struct ScmNPoint
{
int nX;//点的X位置
int nY; //点的Y位置
};
联合体⼀般⽤U开头,如:
union UcmLPoint
{
LONG lX;
LONG lY;
}
(7)对常量(包括错误的编码)命名,要求常量名⽤⼤写,常量名⽤英⽂表达其意思。当需要由多个单词表⽰时,单词与单词之间必须采⽤连字符“_”连接。
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表⽰类别。
(8)对const 的变量要求在变量的命名规则前加⼊c_。即:c_+变量命名规则;⽰例:const char* c_szFileName;
3.4 函数的命名规范
(1)函数的命名应该尽量⽤英⽂(或英⽂缩写、中⽂全拼、中⽂全拼缩写)表达出函数完成的功能——函
数名应准确描述函数的功能。遵循动宾
结构的命名法则,函数名中动词在前,并在命名前加⼊函数的前缀,函数名的长度不得少于8个字母。函数名⾸字⼤写,若包含有两个单词的每个单词⾸字母⼤写。如果是OOP ⽅法,可以只有动词(名词是对象本⾝)。⽰例:
LONG GetDeviceCount(……);c++中string的用法
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;
(2)避免使⽤⽆意义或含义不清的动词为函数命名。如使⽤process、handle等为函数命名,因为这些动词并没有说明要具体做什么。
(3)必须使⽤函数原型声明。函数原型声明包括:引⽤外来函数及内部函数,外部引⽤必须在右侧注明函数来源:模块名及⽂件名;内部函数,只要注释其定义⽂件名——和调⽤者在同⼀⽂件中(简单程序)时不需要注释。
应确保每个函数声明中的参数的名称、类型和定义中的名称、类型⼀致。
3.5 函数参数命名规范
(1)参数名称的命名参照变量命名规范。
(2)为了提⾼程序的运⾏效率,减少参数占⽤的堆栈,传递⼤结构的参数,⼀律采⽤指针或引⽤⽅式传递。
(3)为了便于其他程序员识别某个指针参数是⼊⼝参数还是出⼝参数,同时便于编译器检查错误,应该在⼊⼝参数前加⼊const标志。如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
3.6 ⽂件名(包括动态库、组件、控件、⼯程⽂件等)的命名规范
⽂件名的命名要求表达出⽂件的内容,要求⽂件名的长度不得少于5个字母,严禁使⽤象file1,myfile之类的⽂件名。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论