(转)代码编写风格

来源:互联网 发布:fc660m mac 编辑:程序博客网 时间:2024/06/07 02:30

代码编写风格

作者:王斌

日期:2011 年2 月18 日星期五

1. 文档的目的................................................................................................................................. 2

2. 编程术语..................................................................................................................................... 2

3. 命名习惯..................................................................................................................................... 2

1. 文档的目的

每个程序员都应该使他的代码具有下面的特性:

� 容易给别人阅读、理解

� 容易重新编写

2. 编程术语

� Pascal case:标识符的第一个字母和其后连接单词的第一个字母都以大写字母书写

如:PascalCase

� Uppercase:所有的字母在定义中都以大写书写

如:UPPERCASE

3. 命名习惯

基本规则:

1) 命名用完整的英文描述

2) 意思明了的标示符名称

例:

用意思明了的标识符名称,代码本身就可以理解

GOOD BAD

U16 *pszFileName;

U16 *pszDirectoryName;

U16 *pszStr1;

U16 *pszStr2;

例:

在file.c 文件中,创建并添加一个文件到文件列表中

在BAD 的例子中,函数的名称并不能充分的描述它的功能

GOOD BAD

FILE CreateAndAdd; FILE Add;

3) 实体的名字可以充分并准确的描述本身

4) 避免特殊的名字

5) 缩写

1 在适当的地方,用众所周知的的缩写代替过长的短语

例:UI 代替User Interface

2 只用明了的缩写

3 如果缩写不是经常用到,就用完整的名字

4 缩写一旦使用,就在工程的所有地方使用此缩写

6) 不要用不一致的名字

7) 避免不必要过长的名字

8) 避免非常相近的名字

一览表:

SymboSymbol Case style Description

文件

module_file_name.c 小写文件包含模块(目录) 'module'

module_file_name.h 小写

文件包含'module'的标题信息. 在这个文件种的

定义必须包括'module' 或者‘MODULE’ 的前

缀, 并且通过模块来输出.

函数

MODULE_FilenameActionDescription

PascalCase

Module

前缀大写

MODULE_ 是从文件或模块(目录)来的名字前

缀。它可能是通过‘Filename’ (optional).来的名

ActionDescription 描述的是函数所做的标准动

作词: Get, Set, Construct, Destruct.... (看verbs

表).

_ActionDescription PascalCase

‘_’ 表示为局部函数.

这种局部函数必须定义static.

变量PrefixBaseVariableName PascalCase

前缀Prefix 表示为变量的范围

Base 表示为数据类型.

宏定义

#define MODULE_MacroName( ) (...)

PascalCase

Module

前缀大写

跟函数名相同.

#define _MacroName( ) (...) PascalCase 跟函数名相同.

编辑开关D_COMPILATION_SWITCH UpperCase 前缀‘D_’ 必须用

#define

named MODULE_NAMED_CONSTANT UpperCase 如果全局变量(在模块中的头文件),常量名必须

constant

在模块开始或者文件的前缀.

NAMENAMED_CONSTANT UpperCase

局部常量在模块中,应该定义在代码文件的顶

端.

Typedef TYPE_NAME UpperCase typedef 涉及到enum, unions 和structures.

函数命名:

� 使用Pascal case

� 使用动词或动词短语

� 名字“从长到短”

变量命名:

� 用前缀去定义作用范围

� 一个base affix 对应一个变量,不能几个base affix 混合使用

� 名字“从长到短”

例子:

在模块目录’Menu_system’中包含文件ms_display.c, 在这个文件中是怎么命名的呢?

GOOD BAD

void MS_DisplayAddObject(...) void DisplayAddObject(...)

void MS_DisplayAddObject(...) void MS_AddDisplayObject(...)

STATIC void _DisplayAddArea(...) STATIC DisplayAddArea(...)

ExamplesExamples:

Variable declaration Description

BOOL bBoolean; Variable of type BOOL

BOOL gbBoolean; Global variable of type BOOL

STATIC BOOL sbBoolean; Static variable of type BOOL

BOOL mbBoolean; Member of a structure or Union of type BOOL

U8 cChar; Variable of type U8

U8 gcChar;

STATIC U8 scChar;

U8 mcChar;

S8 cChar; Variable of type S8

S8 gcChar;

S8 scChar;

S8 mcChar;

U16 wWord; Variable of type U16

U16 gwWord;

STATIC U16 swWord;

U16 mwWord;

U32 dwDoubleWord; Variable of type U32

U32 gdwDoubleWord;

STATIC U32 sdwDoubleWord;

U32 mdwDoubleWord;

U16 *pWord; Pointer to a U16

U16 *gpWord;

Prefix Base affix

g Global b Boolean

s Static c INT8 or UINT8

m Struct member w UINT16

dw UINT32

n INT16

l INT32

f Bit-field

p Pointer

pfn Pointer to function

a Array

sz Pointer to NULL terminated string

o Structure

t Typedef defined except struct

STATIC U16 *spWord;

U16 *mpWord;

MSO_MENU *pMenu; Pointer to a structure type defined MSO_MENU

MSO_MENU *gpMenu;

STATIC MSO_MENU *spMenu;

MSO_MENU *mpMenu;

U16 **pWord; Pointer to a pointer to a U16

U16 **gpWord;

STATIC U16 **spWord;

U16 **mpWord;

MS_OP (*pfnOperation)(..); Pointer to a funtion ‘Operation’ returning typdef MS_OP.

MS_OP (*gpfnOperation)(..);

STATIC MS_OP (*spfnOperation)(..);

MS_OP (*mpfnOperation)(..);

U16 aArray; Array of U16

U16 gaArray;

STATIC U16 saArray;

U16 maArray;

PLAY_STATE tPlayState; Variable of type defined by typedef PLAY_STATE

PLAY_STATE gtPlayState;

STATIC PLAY_STATE stPlayState;

PLAY_STATE mtPlayState;

CONST U16 wFileMax; Constant variable of type U16

CONST U16 gwFileMax;

STATIC CONST U16 swFileMax;

CONST U16 mwFileMax;

常量名:

� 所有用大写字母,用"-" 间隔单词

� "D_" 作为前缀

� 使用确定的名字

Example:

用D_’作前缀,用确定的名字。不增加无用的’SUPPORT’,’ENABLE’…

GOOD BAD

D_MPEG4 IS_MPEG4

D_MPEG4

D_DOLBY_EX

D_MPEG4_SUPPORT

D_ENABLE_DOLBY_EX_SUPPORT

D_MPEG4 D_NO_MPEG4

宏定义:使用"_" 作为前缀

例:

#define _Max(a, b) ((a) > (b)) ? (a) : (b)

枚举类型命名:

� 所有用大写字母,用"-" 间隔单词

� 总是用typedef 来定义enum

� 使用"ENUM" 作为type 的前缀

� 使用"_LAST" 作为后缀定义最后一个值

Example:

Define all enum as typedef.

GOOD BAD

typedef enum

{

ENUM_SID_TYPE_AUDIO,

ENUM_SID_TYPE_VIDEO,

ENUM_SID_TYPE_SUBPIC,

ENUM_SID_TYPE_LAST,

} ENUM_SID_TYPE;

enum

{

ENUM_SID_TYPE_AUDIO,

ENUM_SID_TYPE_VIDEO,

ENUM_SID_TYPE_SUBPIC

};

Example:

Use the type defined name as prefix for the values enumerated.

GOOD BAD

typedef enum

{

ENUM_DISC_TYPE_CDDA,

ENUM_DISC_TYPE_DVD_VIDEO,

ENUM_DISC_TYPE_DVD_AUDIO,

ENUM_DISC_TYPE_SVCD,

...

ENUM_DISC_TYPE_NO_DISK,

ENUM_DISC_TYPE_LAST,

} ENUM_DISC_TYPE;

typedef enum

{

DISC_TYPE_CDDA,

DISC_TYPE_DVD_VIDEO,

DISC_TYPE_DVD_AUDIO,

DISC_TYPE_SVCD,

...

DISC_TYPE_NO_DISK,

DISC_TYPE_LAST

} ENUM_DISC_TYPE;

结构类型命名:

� 总是用typedef 定义struct

� 使用"DEC_" 作为type 的前缀

� 同时使用"*P" 开头定义指针类型的type

� 结构内的变量以"m" 开头

Example:

Define all enum as typedef.

GOOD BAD

typedef struct

{

U16 mTuner;

U32 mBluetooth;

} DEC_STRUCT, *PDEC_STRUCT;

struct

{

U16 Tuner;

U32 Bluetooth;

};

基本数据类型定义:

存储类型定义:

格式规定:

� 使用TAB 键代替空格缩进(一个TAB 相当于4 个空格)

� 在单独行中定义各个变量

� 在指针定义/声明中,*号与前面的类型之间需有空格

� "{" 和"}" 总是在下一行

Example:

GOOD BAD

Convention Basic type Bit Range Comment

BOOL boolean 1 0 or 1 Must be defined as a char

S8 signed char 8 -128 to +127

U8 unsigned char 8 0 to +256

S16 signed short 16 -32,768 to +32,767

U16 unsigned short 16 0 to +65,535

S32 signed long 32 -2,147,483,648 to +2,147,483,648

U32 unsigned long 32 1.7E +/- 308

Convention Basic type

CONST const

STATIC static

static void _Function(void)

{

UINT16 Index;

for (Index = 0; Index < INDEX_MAX; Index++)

{

.....

}

}

static void _Function(void) {

UINT16 Index;

for (Index = 0; Index < INDEX_MAX; Index++) {

.....

}

}

� 局部变量声明后使用一个空行

� 用一个空格

1 算数符与相邻的字符之间:c = a + b

2 逗号之后

3 在关键词之后:if、else、switch、for、do、while

� 用"/" 在路径中作为分隔符