一、命名规范
1、一般规范
在所有命名中,都应使用标准的英文单词或缩写,避免使用汉语拼音。
所有命名都应遵循达意原则,即名称应含义清晰、明确。
所有命名都不易过长,在可表达清晰的前提下越简洁越好。
所有命名都应尽量使用全称。
在类型名称特别复杂的时候,应使用 typedef 来定义别名。
2、文件命名规范
文件名必须由前缀和后缀组成,最好采用长文件命名格式。
文件名必须用英文字母表达,禁止使用中文。
对于几个单词组合表达的文件名,每个单词第一个字母必须大写。
源文件后缀格式可以为.cpp 或.cxx,头文件后缀格式可以为: .h, .hxx。
例: ScreenCapturer.h, H263Encoder.cpp
每一个类最好都有一个头文件和源文件,头文件和源文件的前缀必须与类名相对应。
例:类 CBufferControl 对应 BufferControl.h, BufferControl.cpp
类 CVideoFrame 对应 VideoFrame.h, VideoFrame.cpp
3、变量命名规范
变量命名格式必须是:
变量名=<scope_> + <prefix_> + <qualifier>。
范围前缀 类型前缀 含义标识
范围前缀的取名必须遵照下表:
指针必须要前面m_p<类型前缀>+含义标识
前缀 | 类型 | 例子 |
g_ | 全局作用域 | g_Servers |
m_ | 成员变量 | m_pDoc, |
l_ | 局部作用域 | l_strName |
s_ | 静态变量作用域 | s_strName |
注:局部作用域前缀可以省略不用
类型前缀的取名必须遵照下表:
第 2 页 / 共 13 页
序号 | 原始 | 前缀 | 说明 |
1. | sbyte | sb | 有符号 8 位整数,取值范围在 128~127 之间 |
2. | byte | byte | 无符号 16 位整数,取值范围在 0~255 之间 |
3. | short | s | 有符号 16 位整数,取值范围在-32,768~32,767 之间 |
4. | ushort | us | 为无符号 16 位整数,取值范围在 0~65,535 之间 |
5. | int | n | 有符号 32 位整数,取值范围在-2,147,483,648~ 2,147,483,647 之间 |
6. | uint | un | 无符号 32 位整数,取值范围在 0 ~ 4,294,967,295 之间 |
7. | long | l | 64 位有符号整数,取值范围在 9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
8. | ulong | ul | 64 位无符号整数,取值范围在 0 ~ 18,446,744,073,709,551,615 之间 |
9. | bool | b | 布尔型 |
10. | char | c | 单 Unicode 字符,16 位长度 |
11. | float | f | 取值范围在 1.5x10^-45~ 3.4x10^38 之间, 精度为 7 位数 |
12. | double | d | 取值范围在 5.0x10^-324 ~ 1.7x10^308 之间, 精度为 15~16 位数 |
13. | decimal | dm | 128 位数据类型, 范围从大约 1.0x10^-28 到 7.9x10^28 |
14. | struct | stu | 结构 |
15. | enum | enum | 枚举 |
16. | object | o | 对象 |
4、窗体及控件命名规范
前缀的取名必须遵照下表:。
序号 | 原始 | 前缀 | 说明 |
1 | QMainWindow | mwin | 主窗体 |
2 | QWidget | wgt | 窗体 |
3 | QMenuBar | mbar | 菜单 |
4 | QToolBar | tbar | 工具栏 |
5 | QStatusBar | sbar | 状态栏 |
6 | QDialog | dlg | 对话框 |
7 | QPushButton | pbtn | |
8 | QToolButton | tbtn |
第 3 页 / 共 13 页
9 | QRadioButton | rbtn |
10 | QCheckBox | chk |
11 | QComboBox | cmb |
12 | QDoubleSpinBox | dsb |
13 | QLabel | lbl |
14 | QLineEdit | lie |
15 | QToolBox | tbx |
16 | QTabWidget | twt |
17 | QDockWidget | dwt |
18 | QGroupBox | gbx |
19 | QListView | lvw |
20 | QTreeView | trvw |
21 | QTableView | tavw |
22 | QVBoxLayout | vbl |
23 | QHBoxLayout | hbl |
24 | QGridLayout | grl |
25 | QFormLayout | fol |
5、函数命名规范
类成员函数命名规则最好是:
函数名=函数的含义标识
函数名 = 函数的标示符 刚开始小写后面每个单词大写
其他函数命名规则最好是:函数名=范围前缀_+函数返回值类型+函数的含义标识
函数名的范围前缀可以用来表明函数所属的模块类别。
例: ui_nShowErrorMsg(), ui 表明该函数属于界面模块。
函数的含义标识必须能反映函数实现的功能。
函数的含义标识中第一个字母必须大写。
对于几个单词组合表达的函数的含义标识,每个单词第一个字母必须大
写。
例 1: CheckForErrors()优于 ErrorCheck(),
DumpDataToFile()优于 DataFile().
第 4 页 / 共 13 页
例 2: IsHitRetryLimit(),
RetryMax(),
RetryCnt()等函数名切实反映了其实现的功能
Signal 函数和slot函数都要和普通函数区分开来,前面加slot和signal来区分,
clicked()不是click()
6、类命名规范
类的头文件尽可能少,尽量放在类的定义内!
类名中第一个字母必须为大写“C”。 对于几个单词组合表达的类名,每个单词第一个字母必须大写。
例:用 CTransmitter 而不用 Transmitter。
在类名中最好通过使用前缀来防止类名冲突,前缀可以由 2 个或 2 个以
上的唯一字符组成,前缀必须放在大写字母“C”后。
例: class CICDLinkList{ };
class CAPNLinkList{ };
7、其他命名规范
7.1、常量
常量名中所有字母必须大写,单词间必须用“_” 相隔。
例: const int A_GLOBAL_CONSTANT= 5;
7.2、联合体
联合体类型命名的规则必须是:
联合体名=UN_+含义标识。
联合体含义标识中所有字母必须大写,单词间必须用“_” 相隔 。
7.3、结构体
结构体类型命名的规则必须是:
结构体名=ST_+含义标识。
对于几个单词组合表达的结构体名,每个单词第一个字母必须大写。
7.4、宏
所有字母必须大写,单词间必须用“_” 相隔。
例: define ENCODING_TIME_TESTING
7.5、枚举
枚举名必须加前缀 EN_且枚举名中所有字母必须大写,单词间必须用“_”
相隔。
枚举的成员变量所有字母必须大写,单词间必须用“_” 相隔
第 5 页 / 共 13 页
例:
enum EN_PIN_STATE{PIN_OFF, PIN_ON};
enum { STATE_ERR, STATE_OPEN,
STATE_RUNNING, STATE_DYING};
二、注释规范
1、一般规范
注释的目的必须是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代
码,禁止没必要的重复注释信息。
注释必须语言简炼、易懂而又准确。
单行注释必须用双斜杠进行注释,多行注释必须用/* */进行注释,注释
内容最好放在对应代码的上方。
注释与前面的执行语句之间必须空一行。
必须边写代码边注释,修改代码同时修改相应的注释,以保证注释与代
码的一致性。
注释行数(不包括程序头和函数头说明部分)必须占总行数的 1/5 到
1/3 。
2、文件头部注释
在文件头部必须加注释表明该文件的一些信息,其格式如下:
/************************************************* Copyright©,2014,True Reality Geospatial Solutions, LLC File Name: Date: Author: Description: Version: Change Log:(Author ,Date,Version,Description) *************************************************/ |
注:
•必须在版本栏中保留以前的信息,格式如: 1.0/0.8/0.7。
•在修改记录栏必须按时间先后顺序自下往上排列。
•修改记录中必须特别注明修改了哪些函数。
•注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号所在位置为准进行左对齐。
例:
第 6 页 / 共 13 页
3、函数的注释
对于比较重要的函数或方法必须在其声明处作适当注释, 说明该函数的
功能及各参数的含义,注释模版如下:
// Get data pointer of sub image short* GetSubImageData (int i_nLeft, | // Left position of sub image . |
int i_nTop, | // Top position of sub image . |
WORD i_wWidth, | // Width of sub image . |
WORD i_wHeight); // Height of sub image .
对于自行编写的函数,若是系统关键函数,必须在函数实现部分的上方
标明该函数的信息,格式如下:
//(将函数的简单描述放在这里)
/************************************************* Function Name: Description: Return Value : Parameters:(Name,Description,Value) Author: Date: Version: Change log:(Author ,Date,Version,Description) *************************************************/ |
注: 1、在修改记录栏必须按时间先后顺序自下往上排列。
2、注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号
所在位置为准进行左对齐。
4、常量、变量和宏的注释
在常量、变量(临时变量除外)和宏的声明前必须对其作适当注释, 注
释说明的要点是:
•被保存值的含义(必须)
•合法取值的范围(可选)
•与其它数据,函数或模块的关系(可选)
例:
// default quantilizer level,from 1 to 31.
const int DEFAULT_QL=8
// number of gob,12 for CIF and 3 for QCIF .
int nGob;
第 7 页 / 共 13 页
5、结构体和联合体的注释
对结构体或联合体的注释要点必须是:
•它描述的对象是什么(必须)
•对其分量应按变量注释要求加以注释(必须)
•与其它数据, 函数或模块的关系(可选)
例:
//3D Point(nPosX , nPosY , nPosZ )
typedef struct ST_ THREED_ PT_TAG{
int nPosX; //x Position
int nPosY; //y Position
int nPosZ; //z Position
} ST_THREED_ PT;
6、语句注释
对语句的注释必须放在其上方相邻位置,不要放在下面。
在程序块的结束行右方最好加注释标记,以表明某程序块的结束。
过长的函数实现,最好将其语句按实现的功能分段加以概括性说明.
必须对不易理解的分枝条件表达式加注释.
三、文件编写规范
头文件的构成:
1、头文件的头部注释
2、防止重复包含的宏:
#ifndef _文件名_扩展名
#define _文件名_扩展名
3、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)
4、宏定义部分(可选)
5、类型定义部分(可选)
6、结构体定义部分(可选)
7、函数或类的声明部分
8、防止重复包含的宏: #endif
源文件的构成:
1、源文件的头部注释
2、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)
第 8 页 / 共 13 页
3、宏定义部分(可选)
4、类型定义部分(可选)
5、结构体定义部分(可选)
6、函数或类的定义部分
注:包含文件时禁止使用绝对路径。
四、函数编写规范
1、函数划分
良好的函数划分,必须能够自顶向下逐级抽象地展现设计思想, 提高程
序的易读性和自说明性。
函数必须是按功能划分的, 每个函数必须只做一件事情(高内聚准则)。
相关的一组函数之间的关联必须尽可能少(低耦合准则)。
在不破坏高内聚准则和低耦合准则前提下, 一个函数代码长度最好不超
过 100 行。
2、函数缩进
必须以 4 个空格键来表示一个缩进单位。
在不影响展示程序结构的前提下最好尽可能地减少缩进的层次.
可以使用如下两种缩进风格: (以 if 为例)
( 1 )
if ( expression )
{
statements // 缩进四格
} else
{ | statements | //缩进四格 |
} (2) if ( expression ){ statements | //缩进四格 | |
} else{ | statements | //缩进四格 |
}
在出现缩进限制时,最好遵循如下表示规范:
(1) 过长的条件表达式(以 if 举例):
if (expression1
&& (expression2 // 缩进四格
|| expression3) // 缩进八格
第 9 页 / 共 13 页
&& expression4 ) | //缩进四格 | |
{ | statements | //缩进四格 |
}
(2) 过长的函数原型说明:
OBcObject * OB_DLLPASFUNC FunctionName
( // 缩进四格
Type1 Parameter1, // the paramter means is written here // 缩进八格
Type2 Parameter2, // ... // 缩进八格
......
); // 缩进四格
(3) 过长的函数调用: OBcObject *pObject = FunctionName | //缩进四格 |
( | //缩进八格 |
parameter1, parameter2, ... ); if ( FunctionName ( | //缩进八格 |
parameter1, parameter2, ... ) == 0 && expression... ) | //缩进四格 |
{ }
3、其他
函数的输入参数和输出参数必须少于 5 个,当参数过多时,可以考虑将
参数定义为一个结构体,并且将结构体指针作为参数。
禁止将函数的参数作为工作变量。(将函数的参数作为工作变量,有可
能错误地改变参数内容。对必须改变的参数,最好先用局部变量代替之,
最后再将该局部变量的内容赋给该参数。)
对于超过 3 句以上的语句反复调用,最好封装为函数调用。
提供给外部使用的函数,禁止使用全局变量交换数据。
五、变量和常量使用规范
不要将全部变量的声明放在函数开始处,变量必须在离其第一次使用的
第 10 页 / 共 13 页
位置最近的地方声明。
最好不使用全局变量。
定义变量时要注意区分其有无符号,无符号的变量必须加上 unsigned。
必须尽量使用整型变量代替浮点型变量。
禁止对浮点型变量进行相等比较。
所有变量必须在使用前进行初始化。
最好不使用 malloc(), calloc()和 realloc()而使用 new 来为变量分配空间。
定义常量必须用 const 或 enum,禁止使用#define。
最好用声明的常量代替代码中的经常出现的数字。
必须将常量定义在尽可能小的范围内。
例:
const unsigned int MAX_FOOS = 1000;
const unsigned int MAX_FOO_BUFFERS = 40;
class foo
{
public:
enum { MAX_INSTANCES = 1000; }
...
private:
enum { MAX_FOO_BUFFERS = 40; }
...
};
六、其他类型的使用规范
禁止在结构体和联合体中定义成员函数。
禁止使用预定义宏来实现函数的功能,如果想提高函数调用的速度,可
以将其定义为内联函数(inline 关键字)
七、类的编写规范
在类中最好避免定义 public 和 protected 型成员变量,可以用 public 或
protected 型的成员函数 GetXXX()和 SetXXX()来代替。
最好将类中的一些简单函数(如取成员变量值的函数,激活其他函数的
函数)定义成内联函数。
最好不要将函数的定义放在类中。
第 11 页 / 共 13 页
必须将类中不影响该类成员变量值的成员函数定义为常函数类型(使用
const 关键字)。
禁止在类的构造函数和析构函数中使用全局的对象或变量。
八、可移植性规范
最好将平台相关的代码统一放在一个文件里。
最好利用 typedef 声明预定义的数据类型,避免直接使用预定义的数据
类型。
必须注意数据类型长度的平台相关性,如 int 类型在不同的环境下有 16
位和 32 位之分。但是size_t移植很好
必须注意 int, long, short, float, double 等数据类型在不同的环境下字节
的排列顺序不同。
最好使用预编译头:
如果您的代码可以在多个操作系统及多个编译程序中共享, 一个预编译头文件是必不可少的,
该 文 件 用 来 标 识 当 前 所 用 的 操 作 系 统 、 编 译 程 序 、 CPU 类 型 下 的 本 地 特 征 , 如 下 以
MS-DOS,WIN16,WIN32,Solaris2.x,HPUX,IRIS 操作系统、 Borland C++ 2.0 以上,Microsoft C/C++
7.0 以上, AT&T C++2.0 以上 UNIX 编译器和 INTEL,HP,SGI,SPARC 机为平台的源码级共享所需的
预编译头.
#ifndef __compmacr_h
#define __compmacr_h
// begin the file COMPMACR.H 94.12.11
#ifndef __cplusplus
#error This is not a C++ compiler
#endif
#ifdef hpux
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#define OS_HPUX // this is hp machine & OS
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef _SGI_SOURCE
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#define BYTEREVERT 0 // the numeric byte order is same as ISO
#define OS_SGI // this is SGI machine & OS
第 12 页 / 共 13 页
#define OS_IRIS // this is SGI machine & OS
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef sun
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#ifdef sparc // if is SPARC CPU
#define BYTEREVERT 0 // the numeric byte order is same as ISO
#else // if is other type CPU
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#endif
#include <sys/errno.h> // use errno.h to find OS version
#if !defined(ENOSYS) || ENOSYS==90
#define OS_Solaris1x // this is SunOS 4.x or Solaris 1.x OS
#endif
#if ENOSYS==89
#define OS_Solaris2x // this is SunOS 5.x or Solaris 2.x OS
#endif
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef __TURBOC__
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPTURBO 200 // Turbo or Borland C++ above version 2.0
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#ifdef __MSDOS__
#define OS_DOS // this is MS-DOS OS
#endif
#ifdef _Windows
#define OS_WIN16 // this is MS-Windows 3.x 16bit OS
#endif
#endif
#ifdef _MSC_VER
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPMSC 700 // Microsoft C/C++ above version 7.0
#ifdef MSDOS
#define OS_DOS // this is MS-DOS OS
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#endif
#ifdef _WINDOWS
第 13 页 / 共 13 页
#define OS_WIN16 // this is MS-Windows 3.x 16bit OS
#endif
#endif
#if !defined(ENVIRONMENT)|| !defined(BYTEREVERT)
#error the header file does not support the compiler
#endif
// end the COMPMACR.H
#endif
九、其他规范
程序提交以后对其进行修改时必须将旧语句用/* */或//注释掉,不能自
行删除或修改,对修改情况必须在文件修改记录中加以记载。
禁止在程序中使用 GOTO 语句。
所有的变量使用前必须要初始化,如果指针不初始化,他就会随意随便指,那么就会紊乱,如果变量不初始化,会随便赋值,那么就会造成麻烦,类的构造函数随意搞。
struct要搞构造函数,copy构造函数必须的
多看代码,看完以后 和代码对照一下
如果代码写完以后的函数返回值的判断问题,这个函数是否影响下面的函数,返回的bool类型,尽量让用户进行操作和判断,还是返回一个结果让下面进行用到,不能随意写!都要做一个判断,没有意义的话返回什么值!
测试的话,反工程师式思维测试,测试数据的极大 极小,参数夸张一般 数据各种数据等跨越函数的测试。
输入输出问题,这个问题一般是看调用的函数的
逻辑问题这个很难看出来,但是刚开始就把逻辑关系调好
指针越界 大部分都是这个问题,这个需要自己调。
看空间复杂度时间复杂度通过任务管理器
边界数组的内存越界检查
遇到问题:
1. 自己百度查询
2 google查询
3 帮助文档
4 看别人代码
5 问别人
易犯错误:
公式书写错误,括号,乘号 除号(得到结果的是整除的结果没有余数), %的
以及拼写错误