C++风格指南
1 头文件
(1).h对应.cc,除main函数的.cc文件外。
(2)所有头文件必须自给自足,意思就是用户和重构工具不需要为特别场合而包含额外的文件;.c文件中只包含相应的.h为文件。
(3)用于插入文本的的文件,采用.inc结尾。
(4).h声明模板或内联函数,.cc具体定义。
(5)所有头文件都应该使用 #define 来防止头文件被多重包含, 命名格式是:
<PROJECT>_<PATH>_<FILE>_H_
如:项目 foo 中的头文件foo/src/bar/baz.h
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif // FOO_BAR_BAZ_H_
(6)尽量避免前置声明那些定义在其他项目中的实体,应使用 #include 包含需要的头文件即可。
(7)只有当函数少于 10 行时才将其定义为内联函数,内联中不包含循环和switch语句;虚函数和递归函数不用内联。
(8)#include的路径:如google-awesome-project/src/base/logging.h的头文件应该是#include "base/logging.h";
#include的顺序:
1)本.cc文件的.h文件 (优先位置) 需加空行
2)C 系统文件 需加空行
3)C++ 系统文件 需加空行
4)其他库的 .h 文件 需加空行
5)本项目内 .h 文件 需加空行
2 作用域
3 类
3.1. 构造函数的职责
(1)不要在构造函数中进行复杂的初始化(尤其是那些有可能失败或者需要调用虚函数的初始化)。如果对象需要进行有意义的初始化,考虑使用明确的 Init() 方法或使用工厂模式。
3.2. 初始化
(2)如果类中定义了成员变量, 则必须在类中为每个类提供初始化函数或定义一个构造函数。若未声明构造函数,则编译器会生成一个默认的构造函数,这有可能导致某些成员未被初始化或被初始化为不恰当的值。
3.3. 显式构造函数
(3)对单个参数的构造函数使用 C++ 关键字 explicit。
【6】C++命名约定
参考文献:http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/
https://download.csdn.net/download/qccz123456/10567851
6.1 通用命名规则
使用描述性词语命名、且写词语全称。
int price_count_reader;
6.2 文件命名
文件名全小写,且尽量使用“_”下划线连接字符。
http_server_logs.h
6.3 类型命名
所有类型名(类class、结构体struct、类型定义 typedef、枚举enum)的每个单词首字母均大写,不包含下划线。
class UrlTable{ ...
struct UrlTableProperties {...
typedef hash_map<UrlTableProperties*, string> PropertiesMap;
enum UrlTableErrors{ ...
6.4 变量命名
(1)变量名全小写,使用“_”下划线连接;
(2)类的所有成员变量以“_”下划线结尾,但结构体不需要下划线;
(3)全局变量尽量少使用,需要“g_”作为前缀。
string table_name;
class TableInfo{
private:
string table_name_;
};
struct UrlTableProperties{
int num_entries;
}
int g_keyboard_value;
6.5 常量命名
常量名前加“k”,且其余单词首字母均大写。
const int kDaysInAWeek =7;
6.6 函数命名
函数名的每个单词首字母均大写,且没有下划线。
但,取值和 设值 函数要与存取的变量名相一致。
AddTableEntry();
class MyClass{
public:
int get_num() const { return num_;}
void set_num(int num) { num_ = num; }
private:
int num_;
};
6.7.名字空间命名
名字空间用小写字母命名,“_”下划线隔开,并基于项目名称和目录结构。
6.8.枚举命名
enum UrlTableErrors{
kOK= 0,
kErrorOutOfMemory= 1,
};
enumAlternateUrlTableErrors {
OUT_OF_MEMORY= 1,
MALFORMED_INPUT= 2,
};
6.9.宏命名
通常不应该使用宏,如使用则全大写,单词间下划线隔开。
#define PI_ROUNDED 3.0
6.10.命名规则的特例
如果你命名的实体与已有 C/C++ 实体相似,可参考现有命名策略。
【7】C++注释
参考文献:http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/comments/
注释固然很重要,但最好的代码本身应该是自文档化。有意义的类型名和变量名,要远胜过要用注释解释的含糊不清的名字。
7.1 注释风格
使用 // 或 /* */, 统一就好.
7.2. 文件注释
法律公告和作者信息:版权声明、许可证、作者;
文件内容:.h 文件简单说明类的功能和用法,.cc 文件说明实现细节或算法技巧。
(比如, Copyright 2008 Google Inc.)
(比如, Apache 2.0, BSD, LGPL, GPL)
7.3. 类注释
描述类的功能和用法。
7.4. 函数注释
函数声明处注释描述函数功能; 定义处描述函数实现.
7.5. 变量注释
通常变量名本身足以很好说明变量用途. 某些情况下, 也需要额外的注释说明.
7.6. 实现注释
对于代码中巧妙的, 晦涩的, 有趣的, 重要的地方加以注释.
7.7. 标点, 拼写和语法
注意标点, 拼写和语法; 写的好的注释比差的要易读的多.
7.9. 弃用注释
通过弃用注释(DEPRECATED comments)以标记某接口点(interface points)已弃用。