Google的C++代码风格指南(1)
不经意看到李开复的微博说google的代码规范是全球最好的,没有之一,于是好奇到底好在哪里, google找到地址:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml, 阅读了部分, 深有同感, 写些心得.
首先关于定义define保护宏, 我很早之前写代码有这个习惯,那个时候记得应该是vc6的时代, 就是类似这样的代码:
#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif // FOO_BAR_BAZ_H_
目的是为了不会重复引用, 但后来vc增加一个关键字, 如果没有记错的话,这个关键字是从borland c发展而来的, 就是:
#pragma once
也能起到同样效果, 告诉编译器这个头文件仅引用一次, 不重复包含.
我刚才特意到g++上测试了下,也是支持#pragma once这个指使字的.
关于匿名名字空间
Google是鼓励使用匿名名字空间的, 记得之前看过一篇文章说, 匿名名字空间会带来代码调试的困难, 深感不以为然, 今天再次看到google的规范鼓励匿名名字空间, 深得我心. 使用匿名名字空间的好处在于运行时命名冲突, 一般解决这个问题还有一个方法是static.
关于局部变量的位置
int i;i = f(); // Bad -- initialization separate from declaration.
int j = g(); // Good -- declaration has initialization.
Bad的写法是习惯了c语法的童鞋, 因为c语言要求变量要在函数头部申明, 这样在函数头部放了一堆变量申明, 代码改动多了之后, 也不知道哪些变量后来有没有用到, 反正摆了一堆, 喜庆的是c99后来也不强制要求了.
Good的写法是我一直的书写习惯, 按照google的说法, 就是变量的申明尽量在使用它的地方, 最好能一眼看到在那里申明的, 当然为了某些效率考虑, 可以例外, 比如:
Bad
// Inefficient implementation:for (int i = 0; i < 1000000; ++i) { Foo f; // My ctor and dtor get called 1000000 times each. f.DoSomething(i);}Good
Foo f; // My ctor and dtor get called once each.for (int i = 0; i < 1000000; ++i) { f.DoSomething(i);}不建议使用全局类变量(包括static), 因为这将导致某些bug很难发现, 因为无法决定类的构造顺序.
我点我更是感同身受, 之前在写big world代码时候, 就发现了这个问题, BW里充斥了各种static 全局变量作为singleton, 我还特别写了篇blog说明这个问题, 当时是为了检查内存泄露, 经常是不同singleton退出时依赖, 导致各种退出crash, 后来没有办法都只能直接new一个就不管了, 靠os回收.
最新评论及回复