序
基于谷歌开源项目风格的c++编程风格指南,极简版,指我看了一遍以后的精选,应用向,只说结论,不解释,适合复习和快速查阅。(暂时看不懂的直接略),有空就更新, 参考地址: 中文版:https://google-styleguide.readthedocs.io/zh_CN/latest/google-cpp-英文版:styleguide/index.html https://google.github.io/styleguide/cppguide.html
头文件
Self-contained 头文件
每个头文件都可以被单独编译,即每个.h都满足下面的define条件。
define
如 foo/src/bar/baz.h如下
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif
项目名_目录_目录_文件
前置声明
不要写,用#include代替前置声明。
内联函数
10行以内,不可有switch、循环、递归。
include
带目录,如google-awesome-project/src/base/logging.h 应该按如下方式包含:
#include "base/logging.h"
建议的include顺序如下,并建议换行分隔。
-
相关.h文件 -
C 系统文件 -
C++ 系统文件 -
其他库的 .h 文件 -
本项目内 .h 文件 这种优先的顺序排序保证当 相关.h文件 遗漏某些必要的库时, 当前文件构建会立刻中止。 如
#include "foo/public/fooserver.h"
#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"
平台特定(system-specific)代码需要条件编译(conditional includes)放最后,如
#include "foo/public/fooserver.h"
#include "base/port.h"
#ifdef LANG_CXX11
#include <initializer_list>
#endif
作用域
命名空间
- 建议代码全写命名空间里
- 禁止使用using namespace
- 禁止在namespace std内声明任何东西
- 禁止使用内联命名空间(我不知道这啥,不过更好,不用记了)
- 禁止使用命名空间别名
- 命名空间内代码不用缩进
- 建议在命名空间的结尾右大括号“ } ”处加上注释以表明是哪个namespace结束
匿名命名空间和静态变量
- 在.cpp或.cc文件中,如果变量不会被外部引用,建议用匿名命名空间或static修饰为静态变量
- 禁止在.h文件中使用上面操作
匿名命名空间为
namespace {
...
}
非成员函数、静态成员函数和全局函数
- 建议别写全局函数,写命名空间里
- 建议别写非成员函数,必须写且只在本文件(.cc或.cpp)使用,就写在匿名命名空间内
- 建议用命名空间代替不共享任何静态数据的静态成员函数。如
使用
namespace myproject {
namespace foo_bar {
void Function1();
void Function2();
}
}
而非
namespace myproject {
class FooBar {
public:
static void Function1();
static void Function2();
};
}
局部变量
int i;
i = f();
int j = g();
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int> v = {1, 2};
- 属于 if, while 和 for 语句的变量应当在这些语句中正常地声明,这样子这些变量的作用域就被限制在这些语句中了
while (const char* p = strchr(str, '/')) str = p + 1;
for (int i = 0; i < 1000000; ++i) {
Foo f;
f.DoSomething(i);
}
Foo f;
for (int i = 0; i < 1000000; ++i) {
f.DoSomething(i);
}
静态和全局变量
- 禁止定义静态储存周期非POD变量,包括: 全局变量, 静态变量, 静态类成员变量, 以及函数静态变量。POD(原生数据类型 Plain Old Data: 即 int, char 和 float, 以及 POD 类型的指针、数组和结构体。)
- 如果确实需要一个 class 类型的静态或全局变量,可以考虑在 main() 函数或 pthread_once() 内初始化一个指针且永不回收。注意只能用 raw 指针,别用智能指针。
构造和析构顺序的不确定性导致的,所以上面说别用智能指针。
|