无意中看到了 Google C++ Style Guide ,开始简简单单的的看了一下,发现很有意思,很久都没看英文文档了,这次碰到了,我就简单的翻译了一下,途中才知道英文没学好就罢了,中文也是一塌糊涂,真是“少壮不努力,老大徒伤悲”呀!
Google C++ Style Guide,姑且我翻译为Google C++ 编程规范。每个单位,每个团队,每个人都有自己的编码习惯,也不能说谁的一定好,谁的一定差,总之,我认为有很好的可读性,和有很好的维护性的代码风格为好。
看别人的东西是很有快感的,英文也是那样,但是从英文翻译成中文就很纠结了,恰好最近项目不是很紧张,抽了点空翻译了一下。废话不多,下面开始。首先是各个章节,包含:
1.Header Files
2.Scopinig
3.Classes
4.Google Specific Magic
5.Other C++ Features
6.Naming
7.Comments
8.Formatting
9.Exceptions to the Rules
在这篇里面,首先写下前面2章的笔记。
1.Header Files,头文件
每一个cpp文件有应该含有一个.h的头文件,一般规定main()在cpp文件里面。
(1) The #define Guard: #define的保护文件的唯一性
许多头文件用#define来防止被多重包含,使用格式为“<PROJECT>_<PATH>_<FILE>_H_”。
(2) Header File Dependencies ,头文件的附属作用
能使用前置声明的情况下就不要使用#include。大量在.h文件里面使用#inlcude,如果被包含的文件修改,包含的文件就会从新编译。
(3) Inline Functions,内联函数
只有不足10行的代码才建议使用内联函数,合理的使用能很大程度增加程序运行的效率,反之,能减慢程序的速度。
析构函数最好不要使用内联,因为析构函数实现的代码比你写的要长很多。
有循环和switch的不要使用内联,除非循环和switch永远没有执行。
小心虚函数和递归函数,即使你定义为内联函数,编译器也不会按照内联函数来处理。
(4) The -inl.h Files,内联函数的头文件
在需要的时候你应该定义一个 -inl.h 文件来管理你的内联函数。
简单的函数在.h里面实现就可以,但是如果稍微复杂一点的,就放在-inl.h文件,来减少.h的大小。
千万不要忘记用#define来防止多重包含呀!
(5) Function Parameter Ordering 函数参数的排序
先输入后输出。
输入的参数总是const&,而输出的参数为non-const。
不要轻易的再函数后面增加参数,先搞清楚这个函数是输入还是输出!
(6) Names and Order of Includes,头文件的包含顺序
A. dir2/foo2.h (preferred location — see details below).
B. C system files.
C. C++ system files.
D. Other libraries' .h files.
E. Your project's .h files.
2.Scoping 范围
(1)Namespace命名空间
Namespace 全局划分不同的区域, 在全局上非常有用的阻止名字的冲突。
分为 Unnamed Namespaces和 Named Namespaces。
Unnamed Namespaces:
在cpp文件里面鼓励使用没有名字的命名空间( Unnamed namespaces ),但是在.h文件里面不要使用。
文件范围内的静态成员变量或者静态成员函数相当于一个unnamed namespace.的成员。
Unnamed Namespaces的最后一行记得加上注释。
Named Namespaces:
Namespaces应该在include 后面使用。
不要在namespaces std中声明任何东西。
你不要使用 using namespace来直接引用定义的对象。
// Forbidden -- This pollutes the namespace.
using namespace foo;
(2)Nested_Classes 嵌套类
使用公共嵌套类当是接口的时候。
(3) Nonmember, Static Member, and Global Functions,
在一个 namespace 中的非成员函数或者一个全局的静态函数,一般很少使用全局函数。
(4)Local_Variables 局部变量
在声明的时候记得初始化哦!
在最近使用到的地方定义。(好像是神马就近原则)
int i;
i = f(); // Bad -- initialization separate from declaration.
int j = g(); // Good -- declaration has initialization.
在循环条件中定义的是一个局部变量。
如果在循环中定义的对象是一个类对象的,放到类外面定义,因为每次循环都要调用类的构造函数和析构函数。
(5)Static and Global Variables 静态变量和全局变量
禁止把类的对象定义为静态变量或者全局变量,由于顺序不明确的构造函数和析构函数,导致很难找到bugs。
POD类型(int ,char, float......)适合成为静态或者全局变量。
如果确实需要一个类对象是一个全局的或者静态的,考虑一下指针对象。
(待续)
因我经验不多,英文也差,语文也差,所以有什么不足之处,请各位看官不吝赐教。谢谢!