自给自足的头文件
头文件应该可以独立编译,并以 .h
为拓展名。给需要被导入但不属于头文件的文件设置为 .inc
拓展名,并尽量避免使用。
#define防护符
所有头文件都应该用 #define
防护符来防止重复导入。防护符的格式是 <项目>_<路径>_<文件名>_H_
.
内联函数
只把 10 行以下的小函数定义为内联(inline).
1 | inline int add(int a, int b) { |
#include的路径及顺序
推荐按照以下顺序导入头文件:配套的头文件,C语言系统库头文件,C++标准库头文件,其他库的头文件,本项目的头文件。
举例来说, google-awesome-project/src/foo/internal/fooserver.cc
的导入语句如下:
1 |
命名空间
除了少数特殊情况,应该在命名空间 (namespace) 内放置代码。命名空间应该有独一无二的名字,其中包含项目名称,也可以选择性地包含文件路径。禁止使用 using 指令 (例如 using namespace foo
). 禁止使用内联 (inline) 命名空间。
1 | namespace mynamespace { |
局部变量
应该尽可能缩小函数变量的作用域 (scope),并在声明的同时初始化。
1 | int i; |
1 | int jobs = NumJobs(); |
1 | vector<int> v; |
通常应该在语句内声明用于 if
、while
和 for
语句的变量,这样会把作用域限制在语句内。例如:
1 | while (const char* p = strchr(str, '/')) str = p + 1; |
需要注意的是,如果变量是一个对象,那么它每次进入作用域时会调用构造函数,每次退出作用域时都会调用析构函数。
1 | // 低效的实现: |
未完待续