xb_parasite 发表于 2011-01-17 22:20

关于在C++头文件中使用预声明而不包含对应头文件的问题讨论

大家好!
关于在C++头文件中只使用
class xxx;
的方式预声明,而不包含对应的头文件从而达到实现与接口分离并且可以减少编译依赖。(参考effective c++ 第34条)
通常的认识是,必须在头文件中将对应的类声明为指针,例如
xxx *x_instance;
而不能写成
xxx x_instance;
原因是编译器必须知道xxx的大小而给它分配空间。

但是我的问题是,既然是在头文件中,而众所周知,头文件只是被包含在源文件中作为源文件的一部分进行编译的,那么就是说,只要我在源文件中包含了所用到的所有类的定义,那么编译器就能够知道对象的大小。
也就是说,例如以下三个文件:
xxx.h
class xxx
{
...
}

yyy.h
class xxx;
class yyy
{
xxx x_instance;
}

yyy.cpp
#include "xxx.h"
#include "yyy.h"
main()
{
yyy y;
}

以上三个文件是应该能够正常编译并执行的。

而实际的情况是,上面这样的写法,在有的时候可以,有的时候并不可以!
我的问题是,为什么有的时候是可以的,而有的时候是不可以的?
对于书上的说法大家觉得对吗?
这样的问题我似乎觉得跟编译器的实现有很大关系,各位认为呢?

drangon 发表于 2011-01-18 08:24

跟编译器无关,主要原因在于cpp文件中的include顺序,或者说是编译单元预处理之后的最终结果

两个原则:
(1)头文件中,能够前向声明的,不要包含另一个头文件
(2)CPP文件中,头文件的引用顺序应该任意的,不应该依赖顺序,每个头文件都是自完备的

一个习惯:
(1)xxx.cpp中引用的第一个头文件是 xxx.h,这样能检查出xxx.h不是自完备的情况

雨过白鹭洲 发表于 2011-01-18 09:58

可以那就是你include进来了类的定义

关于使用前置声明还是直接include,一般的原则是:Don't use an #include when a forward declaration would suffice. 只有当前置声明不能满足时才使用include

这样可以减少依赖性方面的问题

wb112200 发表于 2011-01-18 09:59

{:3_183:} 一楼说的相当全面 赞一个

xb_parasite 发表于 2011-01-18 17:51

一楼说的相当全面 赞一个
wb112200 发表于 2011-01-18 09:59 http://bbs.chinaunix.net/images/common/back.gif


    感谢一楼的回答,学习了。

johntsu 发表于 2011-01-30 15:06

:mrgreen:

starzhestarzhe 发表于 2011-01-31 10:50

可以那就是你include进来了类的定义

关于使用前置声明还是直接include,一般的原则是:Don't use an #in ...
雨过白鹭洲 发表于 2011-01-18 09:58 http://bbs.chinaunix.net/images/common/back.gif


    请问前置声明能满足哪些情况

义阳草莽 发表于 2016-06-12 18:54

这个说的很详细,但是前置声明什么时候满足不了要求呢,我还是去看看effective C++吧
页: [1]
查看完整版本: 关于在C++头文件中使用预声明而不包含对应头文件的问题讨论