2016-12-08 37 views
1

我想知道在執行條件構建時選擇構建哪個的常用(推薦)方法。關於C/C++/QT中的條件構建(宏)


因此,例如,有兩個文件可以選擇。

條件1:

class Page : QWebPage { 
    public: 
     string test1; 
} 

條件2:

class EnginePage : QWebEnginePage { 
    public: 
     string test1; 
     string test2; 
} 

最常見的方式,我看到正在使用類似的makefile相關文件如下:

有關的Makefile文件:

Source  += \ 
       one.h \ 
       two.h \ 
       three.h \ 
       four.h \ 

#if (one_defined) 
    Source += Page.h 
#else 
    Source += EnginePage.h 
#end 


但(這裏是問題)我想知道是否與此類似(使用一個單一的文件,而不是兩個)是可能的,並建議:

單個文件(條件1個+條件2):

#if (one_defined) 
    class Page : QWebPage 
#else 
    class EnginePage : QWebEnginePage { 
#endif 

    public: 
     string test1; 

#if (one_defined) 
     string test2; 
#endif 
} 

回答

1

您可以在.h文件中使用#cmakedefine CMAKE_VAR

CONFIGURE_FILE會自動#define CMAKE_VAR/* #undef CMAKE_VAR*/ 取決於CMAKE_VAR是否設置在CMake的或不更換。

一個具體的例子:

比方說,你有一個被稱爲QWebPage_Defined等於爲true,如果QWebPage定義一個變量的CMake。

你必須再創建一個文件(如configure.h.in),其中包含:

#cmakedefine QWebPage_Defined 

在你的CMake的腳本,你將調用CONFIGURE_FILE功能:

​​

然後在你的頭:

#include "configure.h" // Include the file 

#ifdef QWebPage_Defined // Warning : use #ifdef and not #if 
    class Page : QWebPage 
#else 
    class EnginePage : QWebEnginePage { 
#endif 

    public: 
     string test1; 

#ifdef QWebPage_Defined // Warning : use #ifdef and not #if 
     string test2; 
#endif 
} 
+0

可以匹配類名和實體l文件名被忽略? – Sean83

+0

是的,你可以在C++中忽略它。如果你真的需要根據你的類名得到一個文件名,可以查看CMake的[copy](https://cmake.org/cmake/help/v3.2/command/file.html)函數,但是我不要推薦它。 – Blabdouze