(转)代码编写风格
来源:互联网 发布: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
� 用"/" 在路径中作为分隔符
- (转)代码编写风格
- verilog代码编写风格(他人整理)
- JavaScript代码编写风格
- Android代码编写风格规范
- 开发笔记-(代码编写风格及const理解)
- 良好的代码编写风格(二十五条)
- Verilog良好代码编写风格25条
- Verilog良好代码编写风格25条
- myeclipse 设置代码的编写风格
- Verilog良好代码编写风格25条
- es5 编写类风格的代码
- Groovy探索 对字符串编写Groovy风格的代码
- 值得注意的C代码编写习惯与风格
- 编写可维护的js代码-编程风格笔记
- IDEA里面添加lombok插件,编写简略风格Java代码
- 学习SpringMVC中优秀的代码编写风格
- Mark Otto 编写的HTML/CSS代码风格指南
- linux运用vim编写C风格的代码
- jquery之利用ajax与服务器交谈(加载内容到元素上之不依赖jquery,而利用原生API)
- sizeof和strlen
- 简单的点名系统-Applet界面
- 移除工程中SVN版本控制文件
- 大端模式和小端模式
- (转)代码编写风格
- VMware虚拟串口的设置和使用
- 英语构词法软件wordformation发布全新1.0版本
- Rework:简单有效的产品思维
- linux源代码分析和阅读工具比较
- [婚姻家庭][观点]老公,那些小姐请不要摸
- 利用iptable屏蔽特定网站
- Eclipse里的HTML/jsp/xml编辑器
- USACO 两道题目