2016-12-08 2 views
1

Je voudrais savoir le moyen commun (recommandé) de choisir lequel construire quand je fais une version conditionnelle.En ce qui concerne la construction conditionnelle (Macro) en C/C++/QT


Par exemple, deux fichiers peuvent être sélectionnés.

Condition 1:

class Page : QWebPage { 
    public: 
     string test1; 
} 

Condition 2:

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

La façon la plus commune que j'ai vu est d'utiliser le fichier lié Makefile semblable à ci-dessous:

Fichier lié à Makefile:

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

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


mais (est ici la Question) Je voudrais savoir si semblable à celui (en utilisant un seul fichier au lieu de deux) est possible et recommandé:

fichier unique (Condition 1 + Condition 2):

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

    public: 
     string test1; 

#if (one_defined) 
     string test2; 
#endif 
} 

Répondre

1

Vous pouvez utiliser #cmakedefine CMAKE_VAR dans un fichier .h.

CONFIGURE_FILE remplacera automatiquement par #define CMAKE_VAR ou /* #undef CMAKE_VAR*/ selon que CMAKE_VAR est situé dans CMake ou non.

Un exemple concret:

Disons que vous avez une variable CMake qui est appelé QWebPage_Defined qui est égale à true si QWebPage est défini.

Vous devrez ensuite créer un fichier (par exemple configure.h.in) qui contient:

#cmakedefine QWebPage_Defined 

Dans votre script CMake vous appelez la fonction CONFIGURE_FILE:

configure_file("configure.h.in", "${CMAKE_BINARY_DIR}/configure.h") 

Et puis dans votre tête :

#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

Pourrait la correspondance entre le nom de classe et l'actua l nom de fichier être ignoré? – Sean83

+0

Oui, vous pouvez ignorer cela en C++. Si vous avez vraiment besoin d'un nom de fichier basé sur votre nom de classe, regardez la fonction [copy] (https://cmake.org/cmake/help/v3.2/command/file.html) de CMake, mais je ne le recommande pas. – Blabdouze