• [转] 关于c++的头文件依赖


    http://www.cnblogs.com/yvesliao/p/3938730.html

    PS: 使用单向依赖

    正在看google c++编程规范,里面对头文件依赖是这么说的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    使用前置声明(forward declarations)尽量减少.h文件中#include的数量。
    当 一个头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件被修改,代码就要重新编译。如果你的头文件包含了其他头文件,这些头 文件的任何改变也将导致那些包含了你的头文件的代码重新编译。因此,我们宁可尽量少包含头文件,尤其是那些包含在其他头文件中的。
    使用前置声明可以显著减少需要包含的头文件数量。举例说明:头文件中用到类File,但不需要访问File的声明,则头文件中只需前置声明class File;无需#include "file/base/file.h"
    在头文件如何做到使用类Foo而无需访问类的定义?
    1) 将数据成员类型声明为Foo *或Foo &;
    2) 参数、返回值类型为Foo的函数只是声明(但不定义实现);
    3) 静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。
    另一方面,如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件。
    有时,使用指针成员(pointer members,如果是scoped_ptr更好)替代对象成员(object members)的确更有意义。然而,这样的做法会降低代码可读性及执行效率。如果仅仅为了少包含头文件,还是不要这样替代的好。
    当然,.cc文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件。
    译者注:能依赖声明的就不要依赖定义。

      于是在VC下做了下测试,先自行建立Foo.h,Foo.cpp文件,里面定义一个类CFoo,不用管怎么定义,随便都行,然后建议main.cpp,在里面测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class CFoo;
    class test
    {
    public:
        /*1*/ CFoo func(CFoo foo);//ok
        /*2*/ static CFoo sub;//ok
        /*3*/ CFoo& foo1;//ok
        /*4*/ CFoo* pfoo1;//ok
        /*5*/ CFoo foo; //error
    };

      之前都是直接include Foo.h 文件,这次不引用,而是声明一下CFoo类。下面看test类的声明。

    1、正确。说明了规范中第2点,函数参数和返回值只是声明。

    2、正确。说明了规范中第3点,静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。

    3、4、正确。5错误。说明了规范中第1点,非静态的数据成员必须是指针或引用,否则需要依赖定义,其实也好理解,非静态表示每个实例都占有内存,必然需要知道内存的大小,没有定义怎么能知道呢?

  • 相关阅读:
    RequestMappin
    数组换位子
    mysql 数据表中查找重复记录(条数)
    post测试
    maven
    常用String练习
    删除重复数据
    推荐几个不错的jQuery图表插件,让你的报表更清晰动感
    纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么?
    在中国,我们的知识产权真的陨落了吗?
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4293828.html
Copyright © 2020-2023  润新知