c++代码规范(简略)
关于注释的规范
首要原则
1、所有注释内容至少都需要带上date日期和who帐号信息;
2、注释统一用中文描述,除了自己看的懂,也要别人能看的懂;
3、注释内容,尽量描述业务及相关逻辑,不要描述无意义内容;
单行注释
格式例子:/// [注释内容] by[git帐号], [日期]
适用于一行代码的后面注释,或二行以内代码的前面注释,如下
int m_value; // 增加一个变量,用于控制… by xxx, 20xx-xx-xx
// 增加null if 判断 by by xxx, 20xx-xx-xx
if (!m_ptr.isNull()) {
… …
}
多行注释
超过二行以上代码必须使用;
格式例子如下:
/**
- 注释内容
- @author xxx
- @date 20xx-xx-xx
- ….
*/
头文件注释
使用多行注释格式,需要增加版权等信息、@file 标明头文件名称等,格式例子如下:
/**
- @brief 文件作用,注释内容
- @author xxx
- @date 20xx-xx-xx
- @file xxx.h
- Copyright © xxx.
- All rights reserved.
*/
类注释
使用多行注释格式,需要增加 @brief the [类名] class 标明类名称,格式例子如下:
/**
- @brief 类作用,注释内容
- @author xxx
- @date 20xx-xx-xx
- ….
/
函数注释
使用多行注释格式,需要增加 @brief [函数名称] 标明函数名称,以及 @param和@return 等字段,格式例子如下:
/* - @brief 函数功能,注释内容
- @param int projectId
- @param int toolId
- @return int
- @author xxx
- @date 20xx-xx-xx
- ….
*/
控制代码段结束注释
所有的if, for, switch, while, do, namespace等控制代码段}结束必须加上结束注释,如 // switch (var)
所有#endif 保护宏必须加上结束注释,如 // #ifndef ABC
关于空行的规范
相同业务代码段(以及功能函数)之间不要留空行;
不同业务代码段(以及功能函数)之间用一个空行分隔,适当情况下加注释;
#include、宏定义、class定义、函数和函数之间等,用两个空行分隔;
禁止三个以上空行和其他无意义的空行;
关于#include的规范
首要原则,本工程(模块)内部头文件使用#include “xx.h”;,其他系统、第三方、模块外等头文件使用#include ;,#include顺序请严格按照以下包含顺序执行:
cpp文件第一行,优先包括本类头文件,如:#include “class.h”;
第二部分,包含系统头文件,如:#include ;
第三部分,包含第三方库头文件,如:#include ;
第四部分,包含本系统其他模块头文件,如:#include ;
最后部分,包含本模块其他头文件;如:#include “ToolInfo.h”;
标题关于namespace命名空间的规范
统一xxx命名空间
所有模块使用xxx::[模块名称]做为命名空间,命名空间全部使用小写,格式例子如下:
namespace xxx { namespace common {
如何使用
禁止在类文件头使用using namespace使用命名空间,当有强烈需求时,可以在cpp文件中使用。
关于类的规范
类、函数、成员变量的命名规范
尽量采用单词或多单词的组合,少用缩写和简称;
类名首字母大写;如ProjectInfo;
函数名的每个单词首字母大写 (即 “驼峰变量名” 或 “帕斯卡变量名”), 没有下划线. 对于首字母缩写的单词, 更倾向于将它们视作一个单词进行首字母大写 (例如, 写作 StartRpc() 而非 StartRPC()).
AddTableEntry()
DeleteUrl()
OpenFileOrDie()
(同样的命名规则同时适用于类作用域与命名空间作用域的常量, 因为它们是作为 API 的一部分暴露对外的, 因此应当让它们看起来像是一个函数, 因为在这时, 它们实际上是一个对象而非函数的这一事实对外不过是一个无关紧要的实现细节.)
类成员变量全小写,采用m_开头,多单词组合,用_分隔,如int m_tool_id
函数参数和局部变量,参照上一条(类成员变量),去掉m_开头;如int tool_id
类设计的规范
尽量一个类,一个.h和.cpp(有需要时)文件,文件名和类名相同,如: ToolInfo.h;
类头文件,用#ifndef PROJECT_CLASSNAME_H #define PROJECT_CLASSNAME_H #endif进行封装;(或使用__PROJECT_FILENAME_H__)
类结构顺序如下:typedef->enum->const常量->构造函数->析构函数->[signals]->public函数->protected/private函数->private类成员变量;
类构造函数需要严格按照类成员变量的定义顺序,进行初始化;
所有基本数据类型都需要通过类构造函数初始化;
所有数据类(包括struct结构),必须使用智能指针std::shared_ptr进行封装;
类函数设计的规范
类构造函数、函数参数,为非基础类型变量,采用常量引用定义,如set_name(const std::string& sName),set_data(const std::list& list_data)
类函数返回非基础类型参数时,也采用常量引用定义,如 const std::string& get_name()
类函数不需要修改类成员变量值时,定义成const类函数,如int get_tool_id() const
不对外提供业务类函数,定义成private私有;
禁用返回临时局部变量做为常量引用类函数返回值;
超过二行以上重复代码,请用函数实现,适当用inline内联函数;
原则上,一个函数只实现一个简短、明确的功能,并且代码量最长控制在60-80行左右(一个屏幕可视范围内),超过100行的,设计拆分成不同业务函数进行组装调用;
原则上,一个类的函数数量控制在20-30个左右,超过30个考虑拆分或封装不同业务类进行使用;
类成员变量的规范
类成员变量全部定义为private私有,根据需要提供相应get/set函数,固定格式为去年m替换成get/set,如int m_tool_id变量get函数为get_tool_id();
bool布尔类型,提供is_xxx和has_xxx函数;
其他规范
尽量不用全局变量和静态变量;
尽量用const常量代替宏定义,并且用const_开头全小写定义,如const int const_max_width = 1024;
尽量用enum枚举代替const常量,和其他普通0,1,2…之类固定常量整数;
代码格式统一采用4空格缩进格式;
其他规范请参照《附录Google的C++代码规范》
禁止使用超过三层的if,for,…判断代码控制嵌套,可以用inline函数代替;
其他技术点
多线程和锁采用C++11标准的std::thread和std::mutex
所有容器采用C++标准容器,如std::list/vector/map等,并且增加std::mutex封装成线程安全容器类;
附录Google的C++代码规范
除前面明确标明的代码规范,其他缩进和空格等规范,请参照y以下链接Google的C++代码规范:
Google C++代码规范:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/