免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8844 | 回复: 7
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-17 22:20 |只看该作者 |倒序浏览
大家好!
关于在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;
}

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

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

论坛徽章:
0
2 [报告]
发表于 2011-01-18 08:24 |只看该作者
跟编译器无关,主要原因在于cpp文件中的include顺序,或者说是编译单元预处理之后的最终结果

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

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

论坛徽章:
0
3 [报告]
发表于 2011-01-18 09:58 |只看该作者
可以那就是你include进来了类的定义

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

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

论坛徽章:
0
4 [报告]
发表于 2011-01-18 09:59 |只看该作者
{:3_183:} 一楼说的相当全面 赞一个

论坛徽章:
0
5 [报告]
发表于 2011-01-18 17:51 |只看该作者
一楼说的相当全面 赞一个
wb112200 发表于 2011-01-18 09:59



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

论坛徽章:
0
6 [报告]
发表于 2011-01-30 15:06 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2011-01-31 10:50 |只看该作者
可以那就是你include进来了类的定义

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



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

论坛徽章:
0
8 [报告]
发表于 2016-06-12 18:54 |只看该作者
这个说的很详细,但是前置声明什么时候满足不了要求呢,我还是去看看effective C++吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP