下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 linux C 语言编程规范

linux C 语言编程规范.doc

linux C 语言编程规范

刘视正
2019-01-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《linux C 语言编程规范doc》,可适用于IT/计算机领域

C语言编程规范序言()写作目标()适用范围()读者范围()参考资料()名词解释()可读性和可维护性()命名规则()文件命名()函数命名()变量命名()数据类型命名()宏定义和枚举的取值()标准宏定义()空白的填充()空白行分割规则()空格分割规则()缩进规则()注释规则()文件的组织()源文件组织()文件头()头文件的包含()常量、宏、Typedefs的定义()全局、静态变量的定义()静态函数类型的声明()函数体的排列顺序()头文件组织()文件头()防止头文件的嵌套包含()适应C规则的声明方法()常量、宏、Typedefs的定义()变量、函数的声明()函数的组织()函数头的格式()函数类型的定义()变量的定义()一般语法描述()条件判断语句()分支语句()无条件跳转语句()表达式()结构()附录()C源文件示例:()H头文件示例:()序言写作目标文档所包含的编码规范是在中、大规模的软件开发项目中实际使用过的。撰写这份文档的目的是为了在软件开发工作中具有相同格式的统一规范。这份规范的执行将大大提高代码的可维护性、完整性、可移植性、可读性。适用范围这份文档指明了公司内部所有软件项目的代码开发框架。文档仅仅适用于使用C语言的软件开发工作中。在读本文档之前读者应具备相当熟练C语言开发的工作经验,以至于读者看本文档时不需要任何额外的C语言知识。本文档提供下列内容:C文件及函数的组织内容。变量、数据类型、函数的命名规范。结构、变量的分布、注释书写方法。提高C语言代码的可读性及编码效率。读者范围这份编码规范适用于所有在IPTV软件部工作的软件设计工作者、软件开发工作者。参考资料下面列出的是一些相关的参考文档:TheCProgrammingLanguage:ANSICVersion,BrianWKernighan,DennisMRitchie,PrenticeHall,名词解释codingstandards编码规范Namingconventions命名规则comments注释fileorganization文件组织functionorganization函数组织APIApplicationProgramInterface,应用程序接口EnumEnumerator,枚举ConstintConstantInteger,整形常量CVSConcurrentVersionsSystem(),一种源代码版本控制软件可读性和可维护性这个章节描述了增强C源代码的可读性和可维护性的方法。内容包括:不同类型变量、宏、数据类型、文件、函数的命名差异空白的填充注释书写方法命名规则文件、函数、常量、变量的命名应当采用有意义的名称定义,只有这样才能提高可读性。下面将列出一般的命名方法:选择唯一的并且能够准确、明了的表示出变量用途的名称。单词之间使用下划线符号连接。避免使用容易引起歧意的名称缩写。例如:缩写“inch”有可能会被误认为“inputcharacter”,所以如果要表示“inputcharacter”,则使用inchar的缩写会比较好些。必须保证所使用名称的唯一性,而不要试图依赖字母大小写来区别不同的名称。不允许变量名和typedef使用相同的名称,这样将引起不必要的混淆。文件命名文件名采用MSDOS的短文件名格式,且所有字符均为小写。C和H文件的扩展名分别为*c和*h。为文件命名时应尽量保证整个工程中的唯一性,应使用其所属’模块名’作为前缀(模块名的长度不超过至个字符)。如:oamalarmcbriextnh函数命名所有函数名称均采用大小写字符,单词间以大写字母区分。为全局函数或API命名时,应使用其所属’模块名’作为前缀(模块名的长度不超过至个字符)。如:UHIPGetSlotInfo(void)*globalHIPAPIfunction*为静态函数(如:staticfunctions)命名时,应在该函数类型声明前使用static关键字。如:staticUGetNumOfBrds(void)*staticfunction*变量命名下面所列出的是不同类型变量的命名规则:变量全部采用小写类型缩写大小写字母命名方式,单词间以大写字母区分。如:ucLowerCase。指针变量类型缩写前要’p’,多级指针变量前’p’的个数与指针级数对应函数指针变量前要’pf’。如:void*pVoidU**ppcValue变量类型缩写如下ArrayaPonitpUucScUusSsUulSlBOOLbstructstunionuenume为全局变量命名时,应使用’g’作为前缀。如:gsLowerCase。为静态变量命名时,应使用’s’作为前缀,并以static关键字修饰。如:staticU*splLowerCase注意:全局变量不要被外部模块之间访问,应该通过函数方式进行存取控制,所有之间访问全局变量的代码均被视为不良代码。数据类型命名这里主要描述typedef和enum两种类型的命名规则。下面所列的是基本数据类型。如果需要另外扩充数据类型,则应在这些基本数据类型基础上进行。至于StandardC保留的数据类型我们将不使用。如:char,int,short,longUunsignedbitSsignedbitUunsignedbitSsignedbitUunsignedbitSsignedbitBOOLBoolean注意:BOOL类型是新增的数据类型,采用typedefU的格式定义的。所有上面定义的数据类型都应在具体项目中的一个全局性的公共头文件中定义。所有使用typedef形式定义的struct数据结构名称将使用’T’(或’PT’指针类型)作为前缀。如:typedefstruct{Ub}TName,*PTName所有使用typedef形式定义的union数据结构名称将使用’U’作为前缀。如:typedefunion{UbUa}UName所有使用typedef形式定义的enum数据结构名称将使用’E’作为前缀。如:typedefenum{FMINVALIDCODE,FMINVALIDSLOTID,}EName所有使用typedef形式定义的函数指针名称将使用’PF’作为前缀。如:Typedefvoid(*PFTaskEnty)(void)宏定义和枚举的取值所有宏名,const变量名和enum方式定义的常量名均采用大写字符,单词间以’’区分预编译宏定义前’’尽量避免直接使用数字常量(硬编码),取而代之的是用宏(#define),const和enum方式定义常量值。如:#defineSLOTconstUMAXSLOTNUMBER=enum{RVOK,RVNOMEM,RVTIMEOUT,}注意:)避免在不同文件中使用相同的常量名。全局常量应声明在全局的公共头文件中。)首选使用const类型定义替代宏定义。因为const类型定义将有利于编译器进行类型检查。标准宏定义标准宏定义(如:TRUEFALSE,SUCCESSFAILURE等)应该定义在全局的系统头文件中。这些宏的具体值为:#defineTRUE#defineFALSE#defineOK#defineNG#defineSUCCESS#defineFAILURE空白的填充空白行分割规则空白行的使用可以增加源代码中的可读性,但过多的使用会造成源代码冗长可读性下降。一种比较好的方法是使用空白行分割源代码中的不同部分和相对独立的程序块。如:#defineLOWER#defineUPPER#defineSTEP*此处增加一行空白*voidmain(void){Ux*此处增加一行空白**打印字符串处理部分**此处增加一行空白*for(){printf(…)}}*endofMAIN*空格分割规则if,while,for关键词后加一个空格如:while()二元操作符前后加一个空格如:wCount=GAP逗号后应跟一个空格如:concat(s,s)‘(’后不加空格‘)’、’,’、’’前不加空格但当‘’在for循环比较语句中后应跟一个空格一元操作符前后不加空格‘’、’’、’>’前后不加空格如:好的空格使用方法:*average=*total*count*computetheaverage*注意:各个符号之间都有空格,如=号左右两边。不良的空格使用方法:*average=*total*count*computetheaverage*注意:编译器会将*作为注释的开始,而不会分别当做除号和指针标识符来对待。缩进规则使用,缩进格式,形式如下:if(…){*大括号另起一行*x=yz}禁止使用TAB键,缩进为个空格‘{‘、’}’独占一行,成对对其不缩进注释规则在源代码中添加注释将能使阅读者轻松阅读并提高效率。从用途来分,注释级别分为:文件级:说明当前整个文件的用途等信息。一般放在当前文件的开始处。函数级:说明当前函数的功能、输入输出参数、返回值等信息。一般放在当前函数的开始处。代码级:说明当前行的代码意义、注意事项等信息。一般紧跟注释所说明的代码后面,且与上下文有空行分割以便阅读。从风格来分,注释级别分为:盒型(Boxedcomments):说明大略意图。一般用于说明整个文件或函数的用途等信息。块型(Blockcomments):对大快的代码进行注释,一般是采用*和*成对联用的形式。如:**Writecommenttextthere,incompletesentences*Useblockcommentswhenthereismorethanonesentenceor*morethanoneline*行型(Inlinecomments):与被注释代码在同一行且一般放置在代码之后。可用来说明代码、变量等的意义。如:Uslotid*slotIdis…*X=yz*xis…,yis…,zis…*简型(Shortcomments):采用与被注释源代码相同缩进格式的方式。值得注意的是,C的双斜杠注释方法在C源代码中是不应该使用的。这主要是考虑到避免有的编译器仅支持标准C而不支持C时会出现的编译错误。如:switch(type){*Performcaseforcardtypes*casePRICARD:caseFXSCARD:…default:break}文件的组织在这个章节中我们主要讨论关于如何组织C源文件和H文件。源文件组织下图提供了源文件的组织概况。文件头FileHeader需包含头的文件HeaderFileIncludesDefinesandTypedefsthatapplytothefileasawhole,including:常量定义Constantmacrodefines宏函数定义parameterizedmacrodefines枚举定义EnumsTypedefsGlobaldatadefinitionLocaldatadefinitionLocalfunctiondeclarationFunctionsfunctionheaderfunctionbody文件头下面是IPTV软件部定义的标准文件头*****************************************************************************Copyright(c),ShenzhenHiMediaTechnologyCo,Ltd**AllRightsReserved**Subsystem:IPTVPBXXXX**File:xyzc**CreatedBy:ZZZZ****Purpose:**Thisfilecontainstheimplementationofxyzfeature****History:**ProgrammerDateVerDescription****KexiongDemo*****************************************************************************头文件的包含要确定源代码中的头文件信息就必须用#include预编译指令。为了达到简洁、清晰的效果,应该保证仅仅包含必要的头文件,如果所包含的头文件已经不再需要则应该将该#include语句注释或删除。头文件被包含顺序应为(请注意include后面所跟的括号类型):#include<systemheaderfiles>#include“toollibrariesheaderfiles”#include“subsystemheaderfiles”#include“moduleheaderfiles”注意:一对尖括号<>仅仅用于包含标准C系统的头文件时才使用,一对引号””是用来包含除标准C以外的所有头文件。常量、宏、Typedefs的定义常量、宏、Typedefs的定义位置是放在所有被包含的头文件位置之后的。不同种类的定义其先后排列顺序为:宏常量(#defineidentifiertokenstring)宏函数(#defineidentifier(identifier,…,identifier)tokenstring)枚举EnumsTypedefs注意:这些定义的有效性仅仅存在于当前所在的文件范围之内,如果需要在其他文件中也有效,则需要将该定义放入共同包含的头文件中。全局、静态变量的定义在常量、宏、Typedefs的定义之后,将开始定义全局和静态变量。其位置顺序如下:全局变量(globalvariable)。静态变量(localvariable)。如:UgucTrapId=*globalvariable*staticUssSave*localvariable*静态函数类型的声明静态局部函数的类型声明将放在静态变量定义之后。局部函数的有效范围为当前所处文件。函数类型声明的最左边应使用static关键字。函数参数的变量也应同时被包含在该函数类型的声明中。如:staticUGetSlotId(UucBoardType)函数体的排列顺序在源文件中,推荐函数定义顺序如下:如果文件包含main函数,则该main函数将被放在其他所有函数体之前。将所有逻辑上相关的函数放在同一文件中。如果是普通意义的功能性函数,按字母顺序排列每个函数的位置。关于函数的组织(函数头和函数体)将在下一章节介绍。头文件组织下图提供了头文件的组织概况。文件头FileHeader防止被嵌套包含的宏定义Openingnestedinclusiondirective需包含头的头文件HeaderFileIncludesDefinesandTypedefsthataresharedbymultiplefiles,including:常量定义constantmacrodefines宏函数定义Parameterizedmacrodefines枚举定义EnumsTypedefsExternaldatadeclarationsExternalfunctiondeclarationsClosingnestedinclusiondirective文件头与源文件规则相同。防止头文件的嵌套包含防止头文件被嵌套包含的方法是由在该头文件中定义相关的宏定义来实现的。格式如下#ifndefHEADERNAMEH#defineHEADERNAMEH…#endif适应C规则的声明方法考虑到被C文件所包含的C头文件也将按照C方式编译,所以C头文件中应该对函数类型声明作以下处理:#ifdefcplusplusextern“c”{#endifC函数类型声明列表#ifdefcplusplus}#endif常量、宏、Typedefs的定义与源文件规则相同。变量、函数的声明在头文件中是不应该定义变量实体和函数实体的,因为这将在多个源文件同时包含该头文件的情况下引起重复定义错误。因此在头文件中仅仅存放变量、函数的声明,以便于别的源文件可以调用即可。函数的组织在这个章节中我们主要讨论关于如何组织函数体。一个比较小的函数体是容易被阅读者所理解的。一般而言一个函数体除了注释以外是不超过行代码的长度的。函数类型名词解释:微型函数:<行代码。这种代码是可以允许自由书写格式的。一般函数:>=行代码。大约的函数都属于这种类型,也是我们将讨论的函数类型。下图提供了函数的组织概况。函数头Functionheader函数类型声明Functiondeclaration变量声明Variabledeclaration内部静态变量定义staticinternalvariable局部变量定义automaticvariableStatementswithinthefunction函数头的格式*****************************************************************************Description:**sendTRAPnotificationtotheNetworkManager****ArgumentTypeIODescription****trapidUITRAPIdentifier**trapvalueSITRAPGeneralEntity(orvalue)****ReturnValue:rvtSUCCESSFAILUREvalue**SUCCESS**FAILURE****History(RecommendedbutOptional):**ProgrammerDateDescriptionofRevision****JohnQPublicmmddyyInitialWriting*****************************************************************************函数类型的定义采用ANSIC风格的函数参数声明。SSendTrap(UucTrapId,SsTrapValue)变量的定义在函数体内部声明的变量将遵从如下定义顺序:内部静态变量定义。(定义的最开始处要加static关键字)局部变量定义。一般语法描述条件判断语句单行条件判断语句:if(expr){onestatement}成对条件判断语句:if(expr){statement}else{statement}多行条件判断语句:if(expr){statement}else{if(expr){statement}else{statement}}复合式条件判断语句:if(expr){if(expr){statementstatement}}else{statement}分支语句switch(expr){casea:statementbreakcaseb:statement*gothrough*casec:cased:statementbreakdefault:statementbreak}注意:分支语句中不管有几个case都必须包含default。无条件跳转语句这个语句在C语言中一直以来都是倍受争议的,原因是写的好可以提高效率并且保证可读性,写的不好则会使可读性大幅度降低容易出错。写的好与不好关键就在于一个“度”字。所以我们规定了如下规则(必须遵守):只能在一个函数体内部使用。跳转标识(gotolabel)将和宏定义一样一律使用大写字母,且从所在行的第一列开始并独站一行。表达式一条语句完成一个功能用括号明确表示表达式的操作顺序在进行‘==’比较时,建议将常量常数放置在‘==’左边。如:if(SET==byFlag){statements}结构为避免移植问题,建议结构内部成数据成员按照bits对齐,如果不够bits则填充相应大小的假数据成员。如:structabc{UusAUusDummyUlB}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/31

linux C 语言编程规范

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利