linux+C+语言编程规范.docx

上传人:b****3 文档编号:4856470 上传时间:2022-12-10 格式:DOCX 页数:18 大小:23.36KB
下载 相关 举报
linux+C+语言编程规范.docx_第1页
第1页 / 共18页
linux+C+语言编程规范.docx_第2页
第2页 / 共18页
linux+C+语言编程规范.docx_第3页
第3页 / 共18页
linux+C+语言编程规范.docx_第4页
第4页 / 共18页
linux+C+语言编程规范.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

linux+C+语言编程规范.docx

《linux+C+语言编程规范.docx》由会员分享,可在线阅读,更多相关《linux+C+语言编程规范.docx(18页珍藏版)》请在冰豆网上搜索。

linux+C+语言编程规范.docx

linux+C+语言编程规范

C语言编程规范

1序言(5)

1.1写作目标(5)

1.2适用范围(5)

1.3读者范围(5)

1.4参考资料(5)

1.5名词解释(5)

2可读性和可维护性(7)

2.1命名规则(7)

2.1.1文件命名(7)

2.1.2函数命名(7)

2.1.3变量命名(7)

2.1.4数据类型命名(8)

2.1.5宏定义和枚举的取值(9)

2.1.6标准宏定义(10)

2.2空白的填充(10)

2.2.1空白行分割规则(10)

2.2.2空格分割规则(10)

2.2.3缩进规则(11)

2.3注释规则(11)

3文件的组织(13)

3.1源文件组织(13)

3.1.1文件头(13)

3.1.2头文件的包含(14)

3.1.3常量、宏、Typedefs的定义(14)

3.1.4全局、静态变量的定义(14)

3.1.5静态函数类型的声明(15)

3.1.6函数体的排列顺序(15)

3.2头文件组织(15)

3.2.1文件头(15)

3.2.2防止头文件的嵌套包含(16)

3.2.3适应C++规则的声明方法(16)

3.2.4常量、宏、Typedefs的定义(16)

3.2.5变量、函数的声明(16)

4函数的组织(17)

4.1函数头的格式(17)

4.2函数类型的定义(18)

4.3变量的定义(18)

5一般语法描述(19)

1

5.1条件判断语句(19)

5.2分支语句(20)

5.3无条件跳转语句(20)

5.4表达式(20)

5.5结构(21)

6附录(22)

6.1C源文件示例:

(22)

6.2H头文件示例:

(22)

1序言

1.1写作目标

文档所包含的编码规范是在中、大规模的软件开发项目中实际使用过的。

撰写这份文档的目的是为了在软件开发工作中具有相同格式的统一规范。

这份规范的执行将大大提高代码的可维护性、完整性、可移植性、可读性。

1.2适用范围

这份文档指明了公司内部所有软件项目的代码开发框架。

文档仅仅适用于使用C语言的软件开发工作中。

在读本文档之前读者应具备相当熟练C语言开发的工作经验,以至于读者看本文档时不需要任何额外的C语言知识。

本文档提供下列内容:

C文件及函数的组织内容。

变量、数据类型、函数的命名规范。

结构、变量的分布、注释书写方法。

提高C语言代码的可读性及编码效率。

1.3读者范围

这份编码规范适用于所有在IPTV软件部工作的软件设计工作者、软件开发工作者。

1.4参考资料

下面列出的是一些相关的参考文档:

TheCProgrammingLanguage:

ANSICVersion,BrianW.Kernighan,DennisM.Ritchie,PrenticeHall,1988.

1.5名词解释

codingstandards编码规范

Namingconventions命名规则

comments注释

fileorganization文件组织

functionorganization函数组织

APIApplicationProgramInterface,应用程序接口

EnumEnumerator,枚举

ConstintConstantInteger,整形常量

CVSConcurrentVersionsSystem(11),一种源代码版本控制软件

2可读性和可维护性

这个章节描述了增强C源代码的可读性和可维护性的方法。

内容包括:

不同类型变量、宏、数据类型、文件、函数的命名差异

空白的填充

注释书写方法

2.1命名规则

文件、函数、常量、变量的命名应当采用有意义的名称定义,只有这样才能提高可读性。

下面将列出一般的命名方法:

选择唯一的并且能够准确、明了的表示出变量用途的名称。

单词之间使用下划线符号连接。

避免使用容易引起歧意的名称缩写。

例如:

缩写“inch”有可能会被误认为“inputcharacter”,所以如果要表示“inputcharacter”,则使用in_char的缩写会比较好些。

必须保证所使用名称的唯一性,而不要试图依赖字母大小写来区别不同的名称。

不允许变量名和typedef使用相同的名称,这样将引起不必要的混淆。

2.1.1文件命名

文件名采用MS-DOS的8.3短文件名格式,且所有字符均为小写。

C和H文件的扩展名分

别为*.c和*.h。

为文件命名时应尽量保证整个工程中的唯一性,应使用其所属’模块名_’作为

前缀(模块名的长度不超过2至4个字符)。

如:

oam_alarm.c

bri_extn.h

2.1.2函数命名

所有函数名称均采用大小写字符,单词间以大写字母区分。

为全局函数或API命名时,应使用其所属’模块名_’作为前缀(模块名的长度不超过2至4个字符)。

如:

U16HIP_GetSlotInfo(void);/*globalHIPAPIfunction*/

为静态函数(如:

staticfunctions)命名时,应在该函数类型声明前使用static关键字。

如:

staticU8GetNumOfBrds(void);/*staticfunction*/

2.1.3变量命名

下面所列出的是不同类型变量的命名规则:

变量全部采用小写类型缩写+大小写字母命名方式,单词间以大写字母区分。

如:

ucLowerCase。

指针变量类型缩写前要+’p’,多级指针变量前+’p’的个数与指针级数对应;函数指针变

量前要+’pf’。

如:

void*pVoid;

U8**ppcValue;

变量类型缩写如下

Arraya

Ponitp

U8uc

S8c

U16us

S16s

U32ul

S32l

BOOLb

structst

unionu

enume

为全局变量命名时,应使用’g_’作为前缀。

如:

g_sLowerCase。

为静态变量命名时,应使用’s_’作为前缀,并以static关键字修饰。

如:

staticU8*s_plLowerCase;

注意:

全局变量不要被外部模块之间访问,应该通过函数方式进行存取控制,所有之间访问全

局变量的代码均被视为不良代码。

2.1.4数据类型命名

这里主要描述typedef和enum两种类型的命名规则。

下面所列的是基本数据类型。

如果需要另外扩充数据类型,则应在这些基本数据类型基础上进行。

至于StandardC保留的数据类型我们将不使用。

如:

char,int,short,longU8unsigned8-bit

S8signed8-bit

U16unsigned16-bit

S16signed16-bit

U32unsigned32-bit

S32signed32-bit

BOOLBoolean

注意:

BOOL类型是新增的数据类型,采用typedefU32的格式定义的。

所有上面定义的数据类型都应在具体项目中的一个全局性的公共头文件中定义。

所有使用typedef形式定义的struct数据结构名称将使用’T’(或’PT’指针类型)作为前缀。

如:

typedefstruct

{

U8b;

}TName,*PTName;

所有使用typedef形式定义的union数据结构名称将使用’U’作为前缀。

如:

typedefunion

{

U8b;

U16a;

}UName;

所有使用typedef形式定义的enum数据结构名称将使用’E’作为前缀。

如:

typedefenum

{

FM_INVALID_CODE,

FM_INVALID_SLOT_ID,

}EName;

所有使用typedef形式定义的函数指针名称将使用’PF’作为前缀。

如:

Typedefvoid(*PFTaskEnty)(void);

2.1.5宏定义和枚举的取值

所有宏名,const变量名和enum方式定义的常量名均采用大写字符,单词间以’_’区分

预编译宏定义前+’_’;

尽量避免直接使用数字常量(硬编码),取而代之的是用宏(#define),const和enum方式定义常量值。

如:

#defineSLOT1

constU16MAX_SLOT_NUMBER=16

enum

{

RV_OK,

RV_NO_MEM,

RV_TIMEOUT,

};

注意:

1).避免在不同文件中使用相同的常量名。

全局常量应声明在全局的公共头文件中。

2).首选使用const类型定义替代宏定义。

因为const类型定义将有利于编译器进行类型检查。

2.1.6标准宏定义

标准宏定义(如:

TRUE/FALSE,SUCCESS/FAILURE等)应该定义在全局的系统头文件中。

这些宏的具体值为:

#defineTRUE1

#defineFALSE0

#defineOK1

#defineNG0

#defineSUCCESS0

#defineFAILURE-1

2.2空白的填充

2.2.1空白行分割规则

空白行的使用可以增加源代码中的可读性,但过多的使用会造成源代码冗长可读性下降。

一种比较好的方法是使用空白行分割源代码中的不同部分和相对独立的程序块。

如:

#defineLOWER0

#defineUPPER300

#defineSTEP10

/*此处增加一行空白*/

voidmain(void)

{

U8x;

/*此处增加一行空白*/

/*打印字符串处理部分*/

/*此处增加一行空白*/

for(..;..;..)

{

printf(…);

}

}/*endofMAIN*/

2.2.2空格分割规则

if,while,for关键词后加一个空格

如:

while

(1)

二元操作符前后加一个空格

如:

wCount+=GAP;

逗号后应跟一个空格

如:

concat(s1,s2);

‘(’后不加空格

‘)’、’,’、’;’前不加空格;但当‘;’在for循环比较语句中后应跟一个空格一元操作符前后不加空格

‘[]’_______、’.’、’->’前后不加空格

如:

好的空格使用方法:

*average=*total/*count;/*computetheaverage*/

注意:

各个符号之间都有空格,如=号左右两边。

不良的空格使用方法:

*average=*total/*count;/*computetheaverage*/

注意:

编译器会将/*作为注释的开始,而不会分别当做除号和指针标识符来对待。

2.2.3缩进规则

使用0,4缩进格式,形式如下:

if(…)

{/*大括号另起一行*/

x=y+z;

}

禁止使用TAB键,缩进为4个空格

‘{‘、’}’独占一行,成对对其不缩进

2.3注释规则

在源代码中添加注释将能使阅读者轻松阅读并提高效率。

从用途来分,注释级别分为:

文件级:

说明当前整个文件的用途等信息。

一般放在当前文件的开始处。

函数级:

说明当前函数的功能、输入/输出参数、返回值等信息。

一般放在当前函数的开始处。

代码级:

说明当前行的代码意义、注意事项等信息。

一般紧跟注释所说明的代码后面,且与上下文有空行分割以便阅读。

从风格来分,注释级别分为:

盒型(Boxedcomments):

说明大略意图。

一般用于说明整个文件或函数的用途等信息。

块型(Blockcomments):

对大快的代码进行注释,一般是采用/*和*/成对联用的形式。

如:

/*

*Writecommenttextthere,incompletesentences.

*Useblockcommentswhenthereismorethanonesentenceor

*morethanoneline.

*/

行型(Inlinecomments):

与被注释代码在同一行且一般放置在代码之后。

可用来说明代码、变量等的意义。

如:

U8slot_id;/*slotIdis…*/

X=y+z;/*xis…,yis…,zis…*/

简型(Shortcomments):

采用与被注释源代码相同缩进格式的方式。

值得注意的是,C++的双斜杠注释方法//在C源代码中是不应该使用的。

这主要是考虑到避免有的编译器仅支持标准C而不支持C++时会出现的编译错误。

如:

switch(type)

{

/*Performcaseforcardtypes*/

casePRI_CARD:

caseFXS_CARD:

default:

break;

}

3文件的组织

在这个章节中我们主要讨论关于如何组织C源文件和H文件。

3.1源文件组织

下图提供了源文件的组织概况。

文件头FileHeader

需包含头的文件HeaderFileIncludes

DefinesandTypedefsthatapplytothefileasawhole,including:

常量定义Constantmacrodefines

宏函数定义parameterizedmacrodefines

枚举定义Enums

Typedefs

Globaldatadefinition

Localdatadefinition

Localfunctiondeclaration

Functions

functionheader

functionbody

3.1.1文件头

下面是IPTV软件部定义的标准文件头

/*****************************************************************************Copyright(c)2006,ShenzhenHiMediaTechnologyCo.,Ltd

**AllRightsReserved.

**Subsystem:

IPTV/PBXXXX

**File:

xyz.c

**CreatedBy:

ZZZZ

**

**Purpose:

**Thisfilecontainstheimplementationofxyzfeature.

**

**History:

**ProgrammerDateVerDescription

**----------------------------------------------------------

**Kexiong01/16/0500.00Demo.

**

***************************************************************************/3.1.2头文件的包含

要确定源代码中的头文件信息就必须用#include预编译指令。

为了达到简洁、清晰的效果,

应该保证仅仅包含必要的头文件,如果所包含的头文件已经不再需要则应该将该#include语句注释或删除。

头文件被包含顺序应为(请注意include后面所跟的括号类型):

#include

#include“tool\librariesheaderfiles”

#include“subsystemheaderfiles”

#include“moduleheaderfiles”

注意:

一对尖括号<>仅仅用于包含标准C系统的头文件时才使用,一对引号””是用来

包含除标准C以外的所有头文件。

3.1.3常量、宏、Typedefs的定义

常量、宏、Typedefs的定义位置是放在所有被包含的头文件位置之后的。

不同种类的定义其

先后排列顺序为:

宏常量(#defineidentifiertoken-string)

宏函数(#defineidentifier(identifier,…,identifier)token-string)

枚举Enums

Typedefs

注意:

这些定义的有效性仅仅存在于当前所在的文件范围之内,如果需要在其他文件中也有效,则需要将该定义放入共同包含的头文件中。

3.1.4全局、静态变量的定义

在常量、宏、Typedefs的定义之后,将开始定义全局和静态变量。

其位置顺序如下:

全局变量(globalvariable)。

静态变量(localvariable)。

如:

U8g_ucTrapId=0;/*globalvariable*/

staticU16s_sSave;/*localvariable*/

3.1.5静态函数类型的声明

静态局部函数的类型声明将放在静态变量定义之后。

局部函数的有效范围为当前所处文件。

函数类型声明的最左边应使用static关键字。

函数参数的变量也应同时被包含在该函数类型的声明中。

如:

staticU16GetSlotId(U8ucBoardType);

3.1.6函数体的排列顺序

在源文件中,推荐函数定义顺序如下:

如果文件包含main函数,则该main函数将被放在其他所有函数体之前。

将所有逻辑上相关的函数放在同一文件中。

如果是普通意义的功能性函数,按字母顺序排列每个函数的位置。

关于函数的组织(函数头和函数体)将在下一章节介绍。

3.2头文件组织

下图提供了头文件的组织概况。

文件头FileHeader

防止被嵌套包含的宏定义Openingnestedinclusiondirective

需包含头的头文件HeaderFileIncludes.

DefinesandTypedefsthataresharedbymultiplefiles,including:

常量定义constantmacrodefines

宏函数定义Parameterizedmacrodefines

枚举定义Enums

Typedefs

Externaldatadeclarations

Externalfunctiondeclarations

Closingnestedinclusiondirective

3.2.1文件头

与源文件规则相同。

3.2.2防止头文件的嵌套包含

防止头文件被嵌套包含的方法是由在该头文件中定义相关的宏定义来实现的。

格式如下

#ifndef_HEADERNAME_H_

#define_HEADERNAME_H_

#endif

3.2.3适应C++规则的声明方法

考虑到被C++文件所包含的C头文件也将按照C++方式编译,所以C头文件中应该对函数

类型声明作以下处理:

#ifdef__cplusplus

extern“c”{

#endif

C函数类型声明列表

#ifdef_cplusplus

}

#endif

3.2.4常量、宏、Typedefs的定义

与源文件规则相同。

3.2.5变量、函数的声明

在头文件中是不应该定义变量实体和函数实体的,因为这将在多个源文件同时包含该头文件的情况下引起重复定义错误。

因此在头文件中仅仅存放变量、函数的声明,以便于别的源文件可以调用即可。

4函数的组织

在这个章节中我们主要讨论关于如何组织函数体。

一个比较小的函数体是容易被阅读者所理解的。

一般而言一个函数体除了注释以外是不超过100行代码的长度的。

函数类型名词解释:

微型函数:

<7行代码。

这种代码是可以允许自由书写格式的。

一般函数:

>=7行代码。

大约90%的函数都属于这种类型,也是我们将讨论的函数类型。

下图提供了函数的组织概况。

函数头Functionheader

函数类型声明Functiondeclaration

变量声明Variabledeclaration

内部静态变量定义staticinternalvariable

局部变量定义automaticvariable

Statementswithinthefunction

4.1函数头的格式

/*****************************************************************************Description:

**sendTRAPnotificationtotheNetworkManager.

**

**ArgumentTypeIODescription

**--------------------------------------------------------

**trap_idU8ITRAPIdentifier

**trap_valueS16ITRAPGeneralEntity(orvalue)

**

**ReturnValue:

rv_tSUCCESS/FAILUREvalue

**SUCCESS

**FAILURE

**

**History(RecommendedbutOptional):

**ProgrammerDateDescriptionofRevision

**-------------------------------------------------------

**JohnQ.Publicmm/dd/yyInitialWriting

**

***************************************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1