1. #define 保护
所有头文件都应该使用 #define 防止头文件被多重包含, 命名格式当是:<PROJECT>_<PATH>_<FILE>_H_
项目 SkinTK中的头文件 SkinTK/SkinTK/targetver.h 可按如下方式保护:
#ifndef SKINTK_SKINTK_TARGETVER_H_
#define SKINTK_SKINTK_TARGETVER_H_
#endif//SKINTK_SKINTK_TARGETVER_H_
2. 函数参数的顺序
定义函数时, 参数顺序依次为: 输入参数, 然后是输出参数.
3.cpp#include顺序
<1>本CPP对应的.h
<2>C系统文件
<3>C++系统文件
<4>其他库的.h文件
<5>本项目的.h文件
4.使用静态成员函数或名字空间内的非成员函数, 尽量不要用裸的全局函数.以免污染全局作用域.
5.将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.应使用初始化的方式替代声明再赋值
6.禁止使用 class 类型的静态或全局变量: 它们会导致很难发现的 bug 和不确定的构造和析构函数调用顺序.
7.仅当只有数据时使用 struct, 其它一概使用class.
8.在类中使用特定的声明顺序: public: 在private: 之前, 成员函数在数据成员 (变量) 前;
9.类中的声明顺序:
每个区段内的声明通常按以下顺序:
- typedefs 和枚举
- 常量
- 构造函数
- 析构函数
- 成员函数, 含静态成员函数
- 数据成员, 含静态数据成员
- 声明次序: public ->
protected -> private;
10.所有按引用传递的参数必须加上 const
void Foo(const string &in, string *out);
11.
函数命名, 变量命名, 文件命名应具备描述性; 不要过度缩写. 类型和变量应该是名词, 函数名可以用 “命令性” 动词.
int num_errors; // Good.
int num_completed_connections; // Good.
12.变量命名:
变量名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 如:
string table_name; // OK - uses underscore.
string tablename; // OK - all lowercase.
Warning
string tableName; // Bad - mixed case.
13.常量命名:
有编译时常量, 无论是局部的, 全局的还是类中的, 和其他变量稍微区别一下. k 后接大写字母开头的单词
const int kDaysInAWeek = 7;
14.函数命名:
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
16.
对那些临时的, 短期的解决方案, 或已经够好但仍不完美的代码使用 TODO 注释.
// TODO(kl@gmail.com): Use a "*" here for concatenation operator. // TODO(Zeke) change this to use relations.