精英盒子 -> 程序设计 -> Google C++编码规范学习笔记01 [打印本页]

jybox 2011-10-31 22:33

Google C++编码规范学习笔记01

本文使用署名-非商业性使用 2.5授权保护。即,任何人可以自由复制、发行、展览、表演、放映、广播或通过信息网络传播本作品,或创作演绎作品。但必须保留作者(精英王子/jybox),以及指向该页面(http://jybox.net/jyblog)的链接,并不可用于商业用途。
如需摆脱以上限制,请单独联系作者以获得商业授权。


本文是从Google的C++编码规范提炼出来的
第一章,头文件
1.使用#define来放置文件多重多包含
多重包含就是一个cpp文件把同一个h文件反复包含了几次,这样不仅会降低编译效率,而且在某些情况下,还会导致标识符被重复声明的错误
其实知道这个的人很多,几乎所有类库都用了这样的方法:
即在所有头文件的开始和结束添加这样的代码:
  1. #ifndef FOO_BAR_BAZ_H_
    #define FOO_BAR_BAZ_H_
    ...
    #endif // FOO_BAR_BAZ_H_
应该保证这个标识符是唯一的,推荐由项目名、路径、文件名构成
ps..事实上零毫秒没有包括项目名


2.使用前置声明来减少包含头文件的数量
注意,这只适合于头文件,不适合cpp文件
上面的避免多重包含估计大家构知道,但前置声明知道的就不多了
而且有些人认为前置声明用途不大,但事实上,当项目达到一定规模的适合(现在的零毫秒也算),采用和不采用前置声明往往相差一半的编译时间

前置声明就是简单的声明一个类,告诉编译器这个类已经存在了
比如
  1. #ifndef CLIENTCORE_H
    #define CLIENTCORE_H

    class QApplication;
    class QByteArray;
    class QString;
    class QTcpSocket;
    #include <QAbstractSocket>
    #include <QObject>
    #include "const.h"

    class ClientCore:public QObject
    {
        Q_OBJECT
    public:
    QTcpSocket *conn;
    //.....

这里对四个类进行了前置声明,头文件中只用到了他们的指针或者引用,所以完全不必包含他们的定义,只要简单的前置声明,告诉编译器这个类已经存在就可以了。

下面的情况可以使用前置声明:
1.数据成员是指针或者引用
2.类出现在函数形式参数和返回值中(只有函数声明,没有定义)
3.静态数据成员
下面的情况不能使用前置声明(必须包含完整声明):
1.包含了非静态的数据成员
2.包含了函数的实现(内联函数)
3.父类

最后,上面只针对头文件,实现文件(cpp)是无论如何都要包含完整声明的
编码原则:包含最少的头文件!能只包含声明就不要包含定义!



未完待续




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.038702 second(s),query:4 Gzip enabled