c++代码规范

说明

本文的目的是规范代码书写,使代码具有较好的可读性。
文档中除"建议","提倡","不提倡"文字外,其他均为强制要求

一般的,建议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)会补充一些额外的规范用于限定该项目的源代码。

  • 在其他项目中,也可以补充额外的规范,且为了保证项目组的代码一致性,可以有与本规范不同的约定。这些补充和变化都应在项目文档中注明。

  • 对于历史遗留项目,不改变原代码风格

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在整理代码,所以将以前积累的一些代码规范方面的知识分享出来,希望能对大家编码时有所帮助。一个好的代码风格的重要...
    小小土豆dev阅读 1,941评论 3 19
  • 最近感觉自己老了,一直呆在小公司,感觉到了疲惫与苦涩,虽然并没有如老板所想已达到瓶颈,依然感觉还有好多东西可学和想...
    xuq阅读 2,448评论 12 57
  • 【按语】由于我公司正在准备开发新的App,到时可能有些iOS开发者参与进来。这时如果每个人的Objective-C...
    niu神DNS阅读 1,053评论 2 14
  • 来自 Colinhou的博客 因为代码命名不规范被老大叼了,被同事逼逼了。。。 我们写出来的代码会给很多人看,为了...
    BlessNeo阅读 532评论 1 5
  • 今天晚上,一位,身穿绿色西装的“顾客”正一跳一跳的跳到我家门前,我想:“一定是它饿了,所以它是想和我们共餐...
    袁阳feea阅读 138评论 0 1