c语言变量命名规范更新单片机较多较乱文档格式.docx
《c语言变量命名规范更新单片机较多较乱文档格式.docx》由会员分享,可在线阅读,更多相关《c语言变量命名规范更新单片机较多较乱文档格式.docx(35页珍藏版)》请在冰点文库上搜索。
![c语言变量命名规范更新单片机较多较乱文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/9028c21b-30fd-4d3f-8975-cf86c68f5f0b/9028c21b-30fd-4d3f-8975-cf86c68f5f0b1.gif)
编写高质量的代码不仅可以提高程序执行效率,缩减代码长度,而且对于保证程序的可
靠性也是相当重要的。
事实证明,低效冗长的代码更容易出现错误。
一段高质量代码需要很
多方面的综合配合,如明晰的项目需求、简洁合理的程序结构、出色的文档、高效的语句表
达等,这是一个复杂的工程。
这里只讨论如何编写出高效的表达语句。
后面编程实例中会介
绍如何安排好程序结构。
对此类问题感兴趣的读者可以阅读软件工程方面的相关书籍。
微处理器一般用于特定环境和特定用途,出于成本、功耗和体积方面的考虑,一般都要
求尽量节省使用资源。
并且,由于微处理器的硬件一般都不支持有符号数、浮点数的运算,
且运算位数有限,因此,分配变量时必须仔细。
另外要说明的是,速度和存储器的消耗经常
是两个不可兼顾的目标,多数情况下,编程者必须根据实际情况作出权衡和取舍。
需要注意的事项如下:
(1)通常在满足运算需求的前提下,尽量选择为变量定义字节数少的数据类型。
(2)尽量不用过长的数据类型,如longlong和double。
(3)MSP430不支持位寻址,所以运算中尽量减少位操作。
两种取值的变量,如果RAM容量允许,则可分配为unsignedchar类型,这样可以提高
运算速度。
如果分配成某一字节中的某一位,则可以减少存储器的消耗,但会降低运算
速度。
(4)避免使用浮点数,尽量使用定点数进行小数运算。
如果必须使用浮点数,则尽量使
用32位的float,而不是64位的double。
(5)尽量将变量分配为无符号数据类型。
(6)对于指针变量,如果声明后其值不再改变,则声明成const类型,这样编译器编译
时能够更好地优化所生成的代码。
(7)尽可能使用局部变量而不是全局变量或者静态变量(static)。
这样有利于编译器编
译时更好地优化所生成的代码。
(8)避免对局部变量使用&
取地址符。
因为这样会使编译器无法把此变量放在CPU的寄
存器中,而是放在RAM中,从而失去了优化的机会。
(9)仅在模块内使用的变量声明为staic类型,这样有利于编译器优化。
(10)如果堆栈空间有限,则尽量减少函数调用的层次和递归调用。
(11)如果传送参数过多,则可以将参数组成一个数组或者结构,然后用指针传递。
(12)某些变量在中断程序和普通级别程序中都会被用到,所以必须加以保护。
将变量
声明为volatile类型,编译器优化时就不会移动它,对它的访问也就不会被延迟。
应该保证对
volatile的变量的访问不被打断,为此,可以在访问它的部分加上__monitor声明。
头文件中的内容应该按照固定的顺序编写。
首先使用#include包含语句编写本头文件中.
变量的命名应该基本能够反映变量的数据类型和含义。
一个变量由如下几部分组成:
存
储类型+数据类型+变量名。
命名规则如下:
存储类型
全局变量:
大小写混用,不同部分之间用大写字母隔开。
局部变量:
全部用小写,不同部分之间用“_”隔开。
数据类型全部用小写字母。
char(无)
inti
floatf
doubled
structs
指针p
数组a
有符号g
变量名使用缩写或者拼音都可以,大小写按照存储类型的规定进行。
举例:
unsignedcharMoonRiver;
//全局无符号字符变量
unsignedcharmoon_river;
//局部无符号字符变量
chargMoonRiver;
//全局有符号字符变量
charg_moon_river;
unsignedintiMoonRiver;
//全局无符号整数变量
unsignedint*piMoonRiver;
//全局指向无符号整数类型的指针变量
unsignedintp_moon_river;
//局部指向无符号整数类型的指针变量
有几种最常用到的变量,这里给出特别定义:
q0、q1、q2...定义为unsignedchar类型,为在函数内部声明的局部变量。
iq0、iq1、iq2...定义为unsignedint类型,为在函数内部声明的局部变量。
fq0、fq1、fq2...定义为float类型,为在函数内部声明的局部变量。
n0、n1、n2...定义为unsignedchar或者unsignedint类型,在函数内部作为循环
次数的计数器使用。
---------------------------------------------------------------------------------------
3.缩略语
由于有几种词义在编程时经常会遇到,所以有必要为它们固定定义一个缩写,这样在遇
到这些缩写的时候就能够很快知道它们所表示的内容,这些缩写称为缩略语。
缩略语在定义
变量和函数名的时候都可以使用。
(1)N下标变量。
如要向一个数组中按顺序填充数据,则需要一个变量保存数组的
下标。
如果数组定义为unsignedintaiMoon[5],那么可以定义保存下标的变量为unsigned
charNMoon,这样就很容易知道这个变量是数组aiMoon的下标,而不会将其误用为其他
用途。
(2)b布尔变量,只有“是”和“非”两种取值的变量。
(3)Tim表示与时间有关的变量。
(4)Cnt计数或计时变量。
程序中经常会对某些事件或者时间进行计数。
如变量
CntTimMs是用来计时的变量,计时单位是毫秒。
(5)Pre上一个变量。
通过指针存取数组时,此缩略语用来表示当前指针所指地址的前
一个地址。
(6)Nt下一个变量。
通过指针存取数组时,此缩略语用来表示当前指针所指地址的下
(7)Sta状态变量。
程序中有时需要定义多个工作的状态,程序根据当前所在的状态来
确定执行何种算法。
含有此缩略语的变量表明此变量保存的是当前程序的工作状态。
(8)Max最大值。
(9)Min最小值。
(10)Init初始化变量。
(11)Sys系统变量。
表明此变量是与整个单片机系统有关的变量。
_NOP();
//空操作,可以作为测试点、延时等。
Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。
而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。
别把这两类风格混在一起用。
【规则1-4】程序中不要出现仅靠大小写区分的相似的标识符。
例如:
int x, X;
//变量x与X容易混淆
voidfoo(intx);
//函数foo与FOO容易混淆
voidFOO(floatx);
【规则1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
【规则1-6】变量的名字应当使用“名词”或者“形容词+名词”。
float value;
float oldValue;
float newValue;
【规则1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。
类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
DrawBox();
//全局函数
box->
Draw();
//类的成员函数
【规则1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
例如:
int minValue;
int maxValue;
int SetValue(…);
int GetValue(…);
【建议1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。
这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
--------------------------------------------------------------------------------------
2.简单的Windows应用程序命名规则
作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。
【规则2-1】类名和函数名用大写字母开头的单词组合而成。
class Node;
//类名classLeafNode;
//类名void Draw(void);
//函数名void SetValue(intvalue);
// 函数名
【规则2-2】变量和参数用小写字母开头的单词组合而成。
BOOflag;
int drawMode;
【规则2-3】常量全用大写的字母,用下划线分割单词。
constintMAX= 100;
constintMAX_LENGTH= 100;
【规则2-4】静态变量加前缀s_(表示static)。
voidInit(…) { static ints_initValue;
//静态变量 … }
【规则2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
intg_howManyPeople;
//全局变量
intg_howMuchMoney;
【规则2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
void Object:
:
SetValue(intwidth,intheight)
{
m_width=width;
m_height=height;
}
【规则2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。
例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。
缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!
)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:
缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.
总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if(xistrue){wedoy}
然而,还有一种特殊的情况:
命名函数:
开始的括号是放在下一行的第一位,如下:
intfunction(intx){bodyoffunction}
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白:
(第一)K&
R是___对___的,(第二)如果K&
R不对,请参见第一条.(:
-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"
while"
在do-while循环中,或者"
else"
在if语句中.如下:
do{bodyofdo-loop}while(condition);
以及
if(x==y){..}elseif(x>
y){...}else{....}
理由:
K&
R.
另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.
命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个C语言的程序员会将之命名为"
tmp"
这很容易书写,且并不是那么难以去理解.
然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量来说是必要的了.调用一个名为"
foo"
全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它),就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名--"
count_active_users()"
--或另外的相近的形式,你不应命名为"
cntusr()"
.
有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会去检查它,而这样只会迷惑程序员.--知道为什么Micro$oft为什么会生产这么多"
臭虫"
程序了把!
!
局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有"
i"
如果没有任何可能使得它能被误解的话,将其写作"
loop_counter"
是效率低下的.同样的,"
"
可以是任何临时数值的函数变量.
如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称
function-growth-hormone-imbalancesyndrome.
函数
函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注).
一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的.
然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数.
另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.
注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:
你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:
假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.
语法杂项:
A,运算符前后要有各一个空格。
B,在开始圆括号和后一个字符,以及结束圆括号和上一个字符中不出现空格。
不要在语句中出现不必要的括号。
如if(I=42)then中,括号就是不必要的。
一、程序风格:
1、严格采用阶梯层次组织程序代码:
各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。
要求相匹配的大括号在同一列,对继行则要求再缩进4格。
2、提示信息字符串的位置
在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。
3、对变量的定义,尽量位于函数的开始位置。
---------------------------------------------------------------------------------------
二、命名规则:
1、变量名的命名规则
①、变量的命名规则要求用“匈牙利法则”。
即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。
即:
变量名=变量类型+变量的英文意思(或缩写)
对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下表:
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
unsignedint(WORD)用w开头wCount
unsignedlong(DWORD)用dw开头dwBroad
HANDLE(HINSTANCE)用h开头hHandle
DWORD用dw开头dwWord
LPCSTR(LPCTSTR)用str开头strString
用0结尾的字符串用sz开头szFileName
对未给出的变量类型要求提出并给出命名建议给技术委员会。
②、指针变量命名的基本原则为:
对一重指针变量的基本原则为:
“p”+变量类型前缀+命名
如一个float*型应该表示为pfStat
对多重指针变量的基本规则为:
二重指针:
“pp”+变量类型前缀+命名
三重指针:
“ppp”+变量类型前缀+命名
......
③、全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount,即:
变量名=g_+变量类型+变量的英文意思(或缩写)
④、静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst,即:
变量名=s_+变量类型+变量的英文意思(或缩写)
⑤、成员变量用m_开头,如一个长型成员变量定义为m_lCount;
即:
变量名=m_+变量类型+变量的英文意思(或缩写)
⑥、对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。
并且要求用大写。