分享

Qt使用预处理文件

 牛人的尾巴 2016-12-13
2013-01-22 11:22 1988人阅读 评论(0) 收藏 举报
分类:

参考1:Qt SDK手册的Using Precompiled Headers一节;

  

预编译就是编译一部分代码编译为一个稳定的二进制文件。在编译其余代码的时候,编译器会加载已经保存该二进制文件。编译余下代码的时候不需要重复编译预编译文件,这样就加快的编译过程。

 

  • Windows
    • nmake
    • Dsp projects (VC 6.0)
    • Vcproj projects (VC 7.0 & 7.1)
  • Mac OS X
    • Makefile
    • Xcode
  • Unix
    • GCC 3.4 and above

 

1 在工程中添加预编译文件

1.1 预编译文件的内容

预编译最好包含稳定的不易改变的代码,一个典型的预编译文件结构如下:

Example: stable.h

//Add C includes here

 

 #if defined __cplusplus

 // Add C++ includes here

 #include <stdlib>

 #include <iostream>

 #include <vector>

 #include <QApplication> // Qt includes

 #include <QPushButton>

 #include <QLabel>

 #include"thirdparty/include/libmain.h"

 #include "my_stable_class.h"

 ...

 #endif

 

请注意:该预编译头文件必须区分包含的C文件和C++文件,因为包含C文件的预编译文件不能包含C++文件。

 

 1.2 工程选项

要使工程使用你的预处理文件,你需要加上如下的语句

  1. PRECOMPILED_HEADER = stable.h  

qmake会做其余的工作。你不需要将stable.h包含到HEADERS中,因为当配置支持PCH的时候,qmake会自动帮你包含的该文件的。

所有的平台都支持预编译文件选项precompile_header,你可以使用该选项来条件定义宏USING_PCH,代码如下:

  1. precompile_header:!isEmpty(PRECOMPILED_HEADER) {  
  2. DEFINES += USING_PCH  
  3. }  

2. 可能出现的问题

在某些平台,预编译的文件后缀名很可能和其他文件名称相同。例如,下面的代码可能会生成相同的中间文件。

  1. PRECOMPILED_HEADER = window.h  
  2. SOURCES            = window.cpp  

为了避免这些,最好就是给预编译头文件一个独一无二的名称。


/////////////////////////////////////////////////////

// 这部分我没使用文档里面的例子,那个还不够简单,我这个更简单易懂。

3. 例子代码

  1. stable.h  
  2. #ifndef STABLE_H  
  3. #define STABLE_H  
  4.   
  5. /* Add C includes here */  
  6.   
  7. #if defined __cplusplus  
  8. /* Add C++ includes here */  
  9. #include <QWidget>  
  10. #endif  
  11.   
  12. #endif // STABLE_H  

  1. widget.h  
  2. #ifndef WIDGET_H  
  3. #define WIDGET_H  
  4.   
  5. <pre name="code" class="cpp">//#include <QWidget></pre><p></p>  
  6. <pre></pre>  
  7. <pre name="code" class="cpp">// 我这里故意将该句注释,倘若你添加预编译文件stable.h,肯定会出现</pre><pre name="code" class="cpp">错误:C2504: 'QWidget' : base class undefined</pre><pre name="code" class="cpp">namespace Ui {  
  8. class Widget;  
  9. }  
  10.   
  11. class Widget : public QWidget  
  12. {  
  13.     Q_OBJECT  
  14.       
  15. public:  
  16.     explicit Widget(QWidget *parent = 0);  
  17.     ~Widget();  
  18.       
  19. private:  
  20.     Ui::Widget *ui;  
  21. };  
  22.   
  23. #endif // WIDGET_H</pre><br>  
  24. 下面是<pre name="code" class="cpp">widget.cpp  
  25.   
  26. #include "widget.h"  
  27. #include "ui_widget.h"  
  28.   
  29. Widget::Widget(QWidget *parent) :  
  30.     QWidget(parent),  
  31.     ui(new Ui::Widget)  
  32. {  
  33.     ui->setupUi(this);  
  34. }  
  35.   
  36. Widget::~Widget()  
  37. {  
  38.     delete ui;  
  39. }</pre>最后是  
  40. <p></p>  
  41. <p></p><pre name="code" class="cpp">main.cpp  
  42.   
  43. #include "widget.h"  
  44. #include <QApplication>  
  45.   
  46. int main(int argc, char *argv[])  
  47. {  
  48.     QApplication a(argc, argv);  
  49.     Widget w;  
  50.     w.show();  
  51.       
  52.     return a.exec();  
  53. }</pre><br>  
  54. <br>  
  55. <p></p>  
  56. <p><br>  
  57. </p>  
  58. <p><br>  
  59. </p>  
  60. <p> </p>  
  61. <p> </p>  
  62. <p> </p>  
  63. <p> </p>  
  64. <p> </p>  
  65. <p> </p>  
  66. <p> </p>  
  67. <p> </p>  
  68. <p> </p>  
  69. <p> </p>  
  70. <p> </p>  
  71. <p> </p>  
  72. <p> </p>  
  73. <p> </p>  
  74. <p> </p>  
  75. <p> </p>  
  76. <p> </p>  
  77. <p> </p>  
  78. <p> </p>  
  79. <p> </p>  
  80. <p> </p>  
  81. <p> </p>  
  82.      

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多