《最新c语言变量命名规范更新-单片机-较多较乱.doc》由会员分享,可在线阅读,更多相关《最新c语言变量命名规范更新-单片机-较多较乱.doc(135页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datec语言变量命名规范更新-单片机-较多较乱c语言变量命名规范更新_单片机_较多较乱c语言变量命名规范更新_单片机_较多较乱.txt27信念的力量在于即使身处逆境,亦能帮助你鼓起前进的船帆;信念的魅力在于即使遇到险运,亦能召唤你鼓起生活的勇气;信念的伟大在于即使遭遇不幸,亦能促使你保持崇高的心灵。网上看的一些资料而已。关键字:c语言 规范 变量命名 msp4301 常见命
2、名规则-比较著名的命名规则首推匈牙利命名法,这种命名方法是由Microsoft程序员查尔斯西蒙尼(Charles Simonyi) 提出的。其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。例如:lpszStr, 表示指向一个以0结尾的字符串(sz)的长指针(lp)变量。骆驼(Camel)命名法近年来越来越流行,在许多新的函数库和Java这样的平台下使用得当相多。骆驼命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字
3、。其中第一个单词首字母小写,余下的单词首字母大写。例如:printEmployeePaychecks(),函数名中每一个逻辑断点都有一个大写字母来标记。帕斯卡(Pascal)命名法与骆驼命名法类似。只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。例如:DisplayInfo()和UserName都是采用了帕斯卡命名法。在C#中,以帕斯卡命名法和骆驼命名法居多。事实上,很多程序设计者在实际命名时会将骆驼命名法和帕斯卡结合使用,例如变量名采用骆驼命名法,而函数采用帕斯卡命名法。另一种流行的命名规则称为下划线命名法。下划线法是随着C语言的出现流行起来的,在UNIX/L
4、IUNX这样的环境,以及GNU代码中使用非常普遍。-编写高质量的代码编写高质量的代码不仅可以提高程序执行效率,缩减代码长度,而且对于保证程序的可靠性也是相当重要的。事实证明,低效冗长的代码更容易出现错误。一段高质量代码需要很多方面的综合配合,如明晰的项目需求、简洁合理的程序结构、出色的文档、高效的语句表达等,这是一个复杂的工程。这里只讨论如何编写出高效的表达语句。后面编程实例中会介绍如何安排好程序结构。对此类问题感兴趣的读者可以阅读软件工程方面的相关书籍。微处理器一般用于特定环境和特定用途,出于成本、功耗和体积方面的考虑,一般都要求尽量节省使用资源。并且,由于微处理器的硬件一般都不支持有符号数
5、、浮点数的运算,且运算位数有限,因此,分配变量时必须仔细。另外要说明的是,速度和存储器的消耗经常是两个不可兼顾的目标,多数情况下,编程者必须根据实际情况作出权衡和取舍。需要注意的事项如下:(1)通常在满足运算需求的前提下,尽量选择为变量定义字节数少的数据类型。(2)尽量不用过长的数据类型,如long long 和double。(3)MSP430 不支持位寻址,所以运算中尽量减少位操作。两种取值的变量,如果RAM 容量允许,则可分配为unsigned char 类型,这样可以提高运算速度。如果分配成某一字节中的某一位,则可以减少存储器的消耗,但会降低运算速度。(4)避免使用浮点数,尽量使用定点数
6、进行小数运算。如果必须使用浮点数,则尽量使用32 位的float,而不是64 位的double。(5)尽量将变量分配为无符号数据类型。(6)对于指针变量,如果声明后其值不再改变,则声明成const 类型,这样编译器编译时能够更好地优化所生成的代码。(7)尽可能使用局部变量而不是全局变量或者静态变量(static)。这样有利于编译器编译时更好地优化所生成的代码。(8)避免对局部变量使用&取地址符。因为这样会使编译器无法把此变量放在CPU 的寄存器中,而是放在RAM 中,从而失去了优化的机会。(9)仅在模块内使用的变量声明为staic 类型,这样有利于编译器优化。(10)如果堆栈空间有限,则尽量减
7、少函数调用的层次和递归调用。(11)如果传送参数过多,则可以将参数组成一个数组或者结构,然后用指针传递。(12)某些变量在中断程序和普通级别程序中都会被用到,所以必须加以保护。将变量声明为volatile 类型,编译器优化时就不会移动它,对它的访问也就不会被延迟。应该保证对volatile 的变量的访问不被打断,为此,可以在访问它的部分加上_monitor 声明。头文件中的内容应该按照固定的顺序编写。首先使用#include 包含语句编写本头文件中.-变量的命名应该基本能够反映变量的数据类型和含义。一个变量由如下几部分组成:存储类型+数据类型+变量名。命名规则如下:存储类型全局变量:大小写混用
8、,不同部分之间用大写字母隔开。局部变量:全部用小写,不同部分之间用“_”隔开。数据类型 全部用小写字母。char (无)int ifloat fdouble dstruct s指针 p数组 a有符号 g变量名 使用缩写或者拼音都可以,大小写按照存储类型的规定进行。举例:unsigned char MoonRiver; /全局无符号字符变量unsigned char moon_river; /局部无符号字符变量char gMoonRiver; /全局有符号字符变量char g_moon_river; /全局有符号字符变量unsigned int iMoonRiver; /全局无符号整数变量uns
9、igned int* piMoonRiver; /全局指向无符号整数类型的指针变量unsigned int p_moon_river; /局部指向无符号整数类型的指针变量有几种最常用到的变量,这里给出特别定义:q0、q1、q2. 定义为unsigned char 类型,为在函数内部声明的局部变量。iq0、iq1、iq2. 定义为unsigned int 类型,为在函数内部声明的局部变量。fq0、fq1、fq2. 定义为float 类型,为在函数内部声明的局部变量。n0、n1、n2. 定义为unsigned char 或者unsigned int 类型,在函数内部作为循环次数的计数器使用。-3缩
10、略语由于有几种词义在编程时经常会遇到,所以有必要为它们固定定义一个缩写,这样在遇到这些缩写的时候就能够很快知道它们所表示的内容,这些缩写称为缩略语。缩略语在定义变量和函数名的时候都可以使用。(1)N 下标变量。如要向一个数组中按顺序填充数据,则需要一个变量保存数组的下标。如果数组定义为unsigned int aiMoon5,那么可以定义保存下标的变量为unsignedchar NMoon,这样就很容易知道这个变量是数组aiMoon 的下标,而不会将其误用为其他用途。(2)b 布尔变量,只有“是”和“非”两种取值的变量。(3)Tim 表示与时间有关的变量。(4)Cnt 计数或计时变量。程序中经
11、常会对某些事件或者时间进行计数。如变量CntTimMs 是用来计时的变量,计时单位是毫秒。(5)Pre 上一个变量。通过指针存取数组时,此缩略语用来表示当前指针所指地址的前一个地址。(6)Nt 下一个变量。通过指针存取数组时,此缩略语用来表示当前指针所指地址的下一个地址。(7)Sta 状态变量。程序中有时需要定义多个工作的状态,程序根据当前所在的状态来确定执行何种算法。含有此缩略语的变量表明此变量保存的是当前程序的工作状态。(8)Max 最大值。(9)Min 最小值。(10)Init 初始化变量。(11)Sys 系统变量。表明此变量是与整个单片机系统有关的变量。_NOP(); /空操作,可以作
12、为测试点、延时等。-Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。【规则1-4】程序中不要出现仅靠大小写区分的相似的标识符。例如:intx,X;/ 变量x 与 X 容易混淆void foo(int x);/ 函数foo 与FOO容易混淆void FOO(float x); 【规则1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。【规则1-6】变量的名字应当使用“名词”或者“形容词名词”。例如:f
13、loatvalue;floatoldValue;floatnewValue;【规则1-7】全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。例如:DrawBox(); / 全局函数box-Draw(); / 类的成员函数【规则1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如: int minValue; int maxValue; int SetValue(); int GetValue(); 【建议1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止
14、程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。 -2 简单的Windows应用程序命名规则作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。【规则2-1】类名和函数名用大写字母开头的单词组合而成。例如:class Node; / 类名 class LeafNode;/ 类名 voidDraw(void);/ 函数名 voidSetValue(int value);/ 函数名 【规则2-2】变量和参数用小写字母开头的单词组合而成。例如:BOOflag; intdrawMode; 【规则2-3】常量全用大写的字母,
15、用下划线分割单词。例如:const int MAX = 100;const int MAX_LENGTH = 100; 【规则2-4】静态变量加前缀s_(表示static)。例如:void Init()static int s_initValue; / 静态变量 【规则2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。例如:int g_howManyPeople; / 全局变量int g_howMuchMoney; / 全局变量【规则2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。例如:void Object:SetVal
16、ue(int width, int height)m_width = width;m_height = height; 【规则2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。 -缩进格式Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受. 理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现
17、一个大的缩进格式使得你对程序的理解更容易. 现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序. 总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序. -大符号的位置另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始的大括号放在一行的最后,而将结束大括号放在一
18、行的第一位,如下所示: if (x is true) we do y 然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:int function(int x) body of function 所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是_对_的,(第二)如果K&R不对,请参见第一条. (:-).另外,函数也是特殊的,不一定非得一致. 需要注意的是结束的括号在它所占的那一行是空的,_除了_它跟随着同一条语句的继续符号.如while在do-while循环中,或者else在if语句中.如下: do body of do-loop whi
19、le (condition); 以及if (x = y) . else if (x y) . else . 理由: K&R. 另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了. -命名系统C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个C语言的程序员会将之命名为tmp,这很容易书写,且并不是那么难以去理解. 然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量
20、来说是必要的了.调用一个名为foo全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名-count_active_users()-或另外的相近的形式,你不应命名为cntusr(). 有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现-编译器知道这个类型而且会去检查它,而这样只会迷惑程序员. -知道为什么Micro$oft为什么会生产这么多臭虫程序了把!. 局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有i,如果
21、没有任何可能使得它能被误解的话,将其写作loop_counter是效率低下的.同样的,tmp可以是任何临时数值的函数变量. 如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称function-growth-hormone-imbalancesyndrome. -函数函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注). 一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的
22、. 然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数. 另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情. -注释注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码. 通常情况下,你的注释是说明你的代
23、码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做. -语法杂项:A,运算符前后要有各一个空格。B,在开始圆括号和后一个字符,以及结束圆括号和上一个字符中不出现空格。不要在语句中出现不必要的括号。如 if (I=42) then 中,括号就是不必要的。- 一、程序风格: 1、严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风
24、格,即每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如: 2、提示信息字符串的位置 在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。 3、对变量的定义,尽量位于函数的开始位置。 - 二、命名规则: 1、变量名的命名规则 、变量的命名规则要求用“匈牙利法则”。即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。 即: 变量名=变量类型+变量的英文意思(或缩写) 对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在
25、函数的开始处。 见下表: bool(BOOL) 用b开头 bIsParent byte(BYTE) 用by开头 byFlag short(int) 用n开头 nStepCount long(LONG) 用l开头 lSum char(CHAR) 用c开头 cCount float(FLOAT) 用f开头 fAvg double(DOUBLE) 用d开头 dDeta void(VOID) 用v开头 vVariant unsigned int(WORD) 用w开头 wCount unsigned long(DWORD) 用dw开头 dwBroad HANDLE(HINSTANCE) 用h开头 hHa
26、ndle DWORD 用dw开头 dwWord LPCSTR(LPCTSTR) 用str开头 strString 用0结尾的字符串 用sz开头 szFileName 对未给出的变量类型要求提出并给出命名建议给技术委员会。 、指针变量命名的基本原则为: 对一重指针变量的基本原则为: “p”+变量类型前缀+命名 如一个float*型应该表示为pfStat 对多重指针变量的基本规则为: 二重指针: “pp”+变量类型前缀+命名 三重指针: “ppp”+变量类型前缀+命名 . 、全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount,即:变量名=g_+变量类型+变量的英文意思(或缩写)
27、 、静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst,即: 变量名=s_+变量类型+变量的英文意思(或缩写) 、成员变量用m_开头,如一个长型成员变量定义为m_lCount;即:变量名=m_+变量类型+变量的英文意思(或缩写) 、对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。并且要求用大写。 如:enum cmEMDAYS EMDAYS_MONDAY; EMDAYS_TUESDAY; ; 、对struct、union、class变量的命名要求定义的类型用大写。并要加上前缀,其内部变量的命名规则与变量命名规则一致。 结构一般用S开头 如:struct Sc
28、mNPoint int nX;/点的X位置 int nY; /点的Y位置 ; 联合体一般用U开头 如: union UcmLPoint long lX; long lY; 类一般用C开头 如: class CcmFPoint public: float fPoint; ; 对一般的结构应该定义为类模板,为以后的扩展性考虑 如: template class CcmTVector3d public: TYPE x,y,z; ; 、对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。 如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中C
29、M表示类别。 、对const 的变量要求在变量的命名规则前加入c_,即:c_+变量命名规则;例如: const char* c_szFileName; - 2、 函数的命名规范: 函数的命名应该尽量用英文表达出函数完成的功能。遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。 例如: long cmGetDeviceCount(); 3、函数参数规范: 、 参数名称的命名参照变量命名规范。 、 为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。 、 为了便于其他程序员识别某个指针参数是入口参数还是出口参数,
30、同时便于编译器检查错误,应该在入口参数前加入const标志。如: cmCopyString(const char * c_szSource, char * szDest) 4、引出函数规范: 对于从动态库引出作为二次开发函数公开的函数,为了能与其他函数以及Windows的函数区分,采用类别前缀+基本命名规则的方法命名。例如:在对动态库中引出的一个图象编辑的函数定义为 imgFunctionname(其中img为image缩写)。 现给出三种库的命名前缀: 、 对通用函数库,采用cm为前缀。 、 对三维函数库,采用vr为前缀。 、 对图象函数库,采用img为前缀。 对宏定义,结果代码用同样的前缀
31、。 5、文件名(包括动态库、组件、控件、工程文件等)的命名规范: 文件名的命名要求表达出文件的内容,要求文件名的长度不得少于5个字母,严禁使用象file1,myfile之类的文件名。- 三、注释规范: 1、函数头的注释 对于函数,应该从“功能”,“参数”,“返回值”、“主要思路”、“调用方法”、“日期”六个方面用如下格式注释: /程序说明开始 /=/ / 功能: 从一个String 中删除另一个String。 / 参数: strByDelete,strToDelete / (入口) strByDelete: 被删除的字符串(原来的字符串) / (出口) strToDelete: 要从上个字符串
32、中删除的字符串。 / 返回: 找到并删除返回1,否则返回0。(对返回值有错误编码的要/ 求列出错误编码)。 / 主要思路:本算法主要采用循环比较的方法来从strByDelete中找到 / 与strToDelete相匹配的字符串,对多匹配strByDelete / 中有多个strToDelete子串)的情况没有处理。请参阅: / 书名. / 调用方法:. / 日期:起始日期,如:2000/8/21.9:40-2000/8/23.21:45 /=/ 函数名() - /程序说明结束 、 对于某些函数,其部分参数为传入值,而部分参数为传出值,所以对参数要详细说明该参数是入口参数,还是出口参数,对于某些
33、意义不明确的参数还要做详细说明(例如:以角度作为参数时,要说明该角度参数是以弧度(PI),还是以度为单位),对既是入口又是出口的变量应该在入口和出口处同时标明。等等。 、 函数的注释应该放置在函数的头文件中,在实现文件中的该函数的实现部分应该同时放置该注释。 、 在注释中应该详细说明函数的主要实现思路、特别要注明自己的一些想法,如果有必要则应该写明对想法产生的来由。对一些模仿的函数应该注释上函数的出处。 、 在注释中详细注明函数的适当调用方法,对于返回值的处理方法等。在注释中要强调调用时的危险方面,可能出错的地方。 、 对日期的注释要求记录从开始写函数到结束函数的测试之间的日期。 、 对函数注
34、释开始到函数命名之间应该有一组用来标识的特殊字符串。 如果算法比较复杂,或算法中的变量定义与位置有关,则要求对变量的定义进行图解。对难以理解的算法能图解尽量图解。- 2、变量的注释: 对于变量的注释紧跟在变量的后面说明变量的作用。原则上对于每个变量应该注释,但对于意义非常明显的变量,如:i,j等循环变量可以不注释。 例如: long lLineCount /线的根数。 - 3、文件的注释: 文件应该在文件开头加入以下注释: / / 工程: 文件所在的项目名。 / 作者:*,修改者:* / 描述:说明文件的功能。 / 主要函数: / 版本: 说明文件的版本,完成日期。 / 修改: 说明对文件的修改内容、修改原因以及修改日期。 / 参考文献: . / 为了头文件被重复包含要求对头文件进行定义如下: #ifndef _FILENAME_H_ #define _FILENAME_H_ 其中FILENAME为头文件的名字。