说明
本文的目的是规范代码书写,使代码具有较好的可读性。
文档中除"建议","提倡","不提倡"文字外,其他均为强制要求。
一般的,建议c++程序员都去阅读并参考一下google编程风格指南,这是一个更加详细的规范,但略有复杂,本规范对其进行了简化。
语言
- 头文件保护
所有头文件都应该使用#define防止头文件被多重包含,命名格式为:<PROJECT>_<PATH>_<FILE>_H_
#ifndef FRPL_CORE_TIME_H_
#define FRPL_CORE_TIME_H_
...
#endif // FRPL_CORE_TIME_H_
- 宏定义
尽量不使用宏定义,用内联函数,const,枚举代替
const int NUM_COUNT;
函数参数
定义函数时,参数顺序为:输入参数在前,输出参数在后。
新添加的输入参数,也要置于输出参数之前命名空间
命名空间使用小写字母,长度应尽量短,可使用缩写
代码库的命名空间frpl,其他项目代码的命名空间为"项目名"
不提倡使用using(避免污染命名空间,提高编译执行速度),例如
using namespace std;
string aa;
而应使用
std::string aa;
格式
使用"{"时新起一行。在整个函数只有一行时,不考虑。
空格 vs 制表符
使用空格代替制表符,每次缩进4个空格。
为了保留使用tab的编码习惯,可以在IDE上设置用空格替换制表符(每次使用tab时,IDE会自动转为4个空格)
VS2010设置方式:Tools ->Options ->Text Editor , C/C++ -> Tabs,选择Insert spaces,设置Tab size:4
Sublime2设置方式:首选项->设置默认->修改为"tab_size":4, "translate_tabs_to_spaces": true
- 比较操作符,复制操作符“=”、“+=”,算术操作符“+”,“%”,逻辑操作符“&&”、“&”,位域操作符“<<”等双目操作符的前后要加空格
a += b;
k = x + y;
单目操作符("!"、"~"、"++"、"--"、"&")、函数参数缺省值"="前后无空格
逗号,分号只在后面加空格
void fun(int a, int b);
- 如一行语句过长,则高级运算符前后的空格可以省略
a*b + c*d
命名
- 通用命名规则
必须使用有意义的单词或缩写进行命名,可以使用一些通用的单词缩写(如msg等),可以但不提倡以英文单词的前3~4个字母作为其缩写;
命名规则:以大小驼峰式命名法为主,小写字母加下划线为辅
小驼峰法:第一个单字以小写字母开始,第二个单字的首字母大写。例如:firstName、lastName。
大驼峰法:每一个单字的首字母都采用大写字母,例如:FirstName、LastName、CamelCase。
- 文件、目录:小写字母加下划线
url_table.h
- 类型(类、结构体、枚举):大驼峰法,无下划线
class VideoAcqAVI ...
struct DetectMsg ...
- 变量:小写字母加下划线、全小写、小驼峰法均可,要在同一文件中保持一致
std::string table_name;
std::string tablename;
std::string tableName;
常量建议在名称前加k, 全局变量建议在名称前加g
const int kUseLimit = 9;
int gCashBalance;
- 函数
全局函数、类内普通函数:大驼峰法,无下划线
bool DetectVehicle()
类内get/set/inline函数:小写字母+_+变量名
void set_table_name()
void set_tableName()
class VideoAcqAVI()
{
public:
bool Init();
void set_tableName();
private:
std::string tableName;
}
- 枚举值、宏命名:全大写+下划线(不建议使用宏)
MY_EXCITING_ENUM_VALUE
- 前缀(类型名、全局函数、链接库)
暴露在命名空间全局作用域中的类型名、全局函数均以Fr开头(即类内函数不属于此范畴)
动态、静态链接库均以Fr开头
明确用于内部使用的类型、函数、库可以使用Fri开头
注释
doxygen注释风格
文件头注释
/**
*Copyright (c),2013, Freative
*
*@brief 简述文件完成的主要功能
*@author 作者列表
*@version 版本
*@date 完成日期
*
*/
- 类,函数,变量注释
/**
* @class 类名
* @brief 简述
* @author 作者列表
* @note 细节描述
*/
- 函数注释
/**
* @brief xx函数
* @param[in] a 参数说明
* @param[in] b 参数说明
* @param[in] c 参数说明
* @param[out] buf 输出结果
* @return 0:函数执行成功。
* @return 1:函数执行失败,原因xxx
*/
- 类成员函数、成员变量注释
/** 成员变量描述 */
int m_Var;
int m_color; /**< 颜色变量 */
- 枚举类型注释
/** @brief 枚举类型说明 */
enum AnotherEnum
{
V1, /**< 值描述 */
V2 /**< 值描述 */
};
代码注释
对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释TODO,HACK,FIXME注释
这类注释用于在代码中留下标记,以便日后查找更改。
为方便搜索,采用如下格式。TODO/HACK/FIXME(姓名或联系方式):注释内容
注释标识 | 功能 |
---|---|
TODO | 有一些额外的工作还没有做(但没有bug) |
HACK | 采用了丑陋的方式解决了问题 |
FIXME | 有问题尚未解决 |
尽量不用FIXME,而是应fix掉这个问题。如果因时间不足解决方法丑陋,请用HACK标记
// TODO(someone@fmail.com):xxx
// HACK(tom):xxx
// FIXME(jerry):xxx
windows特性
使用VS进行编译时,将警告级别设置为3级或更高,并将所有warnings当作errors处理
很多代码会包含stdafx.h,为方便代码共享,不建议显式包含此头文件,而改为启用编译器选项FI以自动包含
代码库与项目开发
代码库(FRPL)会补充一些额外的规范用于限定该项目的源代码。
在其他项目中,也可以补充额外的规范,且为了保证项目组的代码一致性,可以有与本规范不同的约定。这些补充和变化都应在项目文档中注明。
对于历史遗留项目,不改变原代码风格