• 7232阅读
  • 7回复

[提问]这样和#include有什么不同? [复制链接]

上一主题 下一主题
离线anubiskong
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-26
— 本帖被 XChinux 执行加亮操作(2011-01-28) —
[pre]
  1. #include <QDialog>
  2. QT_BEGIN_NAMESPACE
  3. class QDialogButtonBox;
  4. class QPushButton;
  5. class QSqlTableModel;
  6. QT_END_NAMESPACE
[/pre][pre]
[/pre][pre]这是一个qt例子中的代码,我不明白NAMESPACE的部分如果换成include会有什么区别[/pre]
离线梅克斯
只看该作者 1楼 发表于: 2011-01-26
这样写好像是编译会快一点,不过在cpp文件中一样要include头文件
只看该作者 2楼 发表于: 2011-01-26
http://no001.blog.51cto.com/1142339/389798
这个网页里有总结,仔细看下转载出处,好像也是出自这个论坛的~~
离线roywillow

只看该作者 3楼 发表于: 2011-01-26
直接搜索一下QT_BEGIN_NAMESPACE差不多就能知道了
好像是如果工程比较大,直接Include可能会因为反复的重复的包含头文件导致编译速度变慢
这样做然后在.cpp中include会比较高效
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线XChinux

只看该作者 4楼 发表于: 2011-01-26
QT_BEGIN_NAMESPACE其实就是个宏,以前Qt4是没有Qt命名空间的,后来才加上的,编译Qt源码时会有选项,是否将这些类放到专用的Qt命名空间内,默认是没有的。这就出来问题了,为了统一,如果你的代码在默认没有Qt命名空间的SDK中编译,那你就不用在前置声明下面这些类的时候加上命名空间,但如果你在有Qt命名空间的SDK中编译,那就得加上命名空间了,为了屏蔽这个差异,使得你的源码能在这两种情况下都进行编译,Qt提供了QT_BEGIN_NAMESPACE宏,这样开发者就省得自己来用程序或宏进行处理了。
class QDialogButtonBox;
class QPushButton;
class QSqlTableModel;

至于说加快编译速度什么的,那是上述三个类的前置声明的作用,这是与Qt无关的(也即与QT_BEGIN_NAMESPACE宏无关)。如果你在头文件中只用到一些类的指针(而非实现),那么就可以不包含这些类的头文件,而只使用上面形式的类型前置声明,而在具体实现时才包含入上面这些类型的头文件。如此,头文件里所包含的头文件减少了,那么使用到这个头文件的程序就能包含更少的内容,而不是每次都包含很多头文件,解析起来都耗时。
[ 此帖被XChinux在2011-01-26 18:32重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线weiweiqiao

只看该作者 5楼 发表于: 2011-01-26
用class只是一个生命,如果用#include的话,则会加载具体的头文件,编译时速度会比较慢,当然生命的都要在cpp中具体用#include
添加上,不然系统会找不见类的定义的
Jobs Insanely Great.
离线roywillow

只看该作者 6楼 发表于: 2011-01-26
回 4楼(XChinux) 的帖子
受教受教
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线wxr159835
只看该作者 7楼 发表于: 2011-01-27
這種寫法為前置聲明,編譯的時候會快一些……
快速回复
限100 字节
 
上一个 下一个