2010-07-15 6 views

Répondre

8

Il semble que vous souhaitez utiliser différents en-têtes en fonction de certains « profil de compilation ».

Au lieu de la solution -D, je suggère plutôt d'utiliser la directive -I pour spécifier les répertoires d'inclusion.

Étant donné que vous avez l'arborescence de fichier suivant:

/ 
    debug/ 
    header.h 
    release/ 
    header.h 

main.cpp:

#include "header.h" 

/* some instructions, not relevant here */ 

Et dans votre Makefile (ou tout autre outil que vous utilisez), juste spécifier le approprié include utiliser , selon la raison que vous voulez:

g++ -I debug main.cpp // Debug mode 

g++ -I release main.cpp // Release mode 

Note de bas de page importante: Je ne sais pas si vous avez l'intention de l'utiliser comme déboguer/relâcher.Cependant, cela serait bizarre: l'interface (les fichiers .h inclus) ne devrait pas changer entre release et debug. Si vous en avez besoin, la méthode habituelle consiste à activer/désactiver certaines parties du code en utilisant des définitions, principalement dans les fichiers .c (et .cpp).

+1

+1 pour la note de bas de page importante! –

4

Vous ne pouvez pas le faire directement, mais cela est possible:

c++ -D "GENERATED=\"build/generated-content\"" main.cpp 

#define INCLUDE_NAME() GENERATED "/header.h" 
#include INCLUDE_NAME() 

EDIT: Cette solution ne fonctionne pas (voir les commentaires ci-dessous).

Essentiellement, toute déclaration #include non conforme à la syntaxe « normale » (soit #include "" ou #include <>), mais étant de la forme #include SOMETHING provoquera quelque chose à prétraité, après quoi il doit se conformer à l'un des « normaux » syntaxes . Quelque chose peut être n'importe quelle séquence de pp-tokens.

Cependant, dans ce cas, le résultat (tel qu'il est généré par GCC) est ...

#include "build/generated-content" "/header.h"

... qui ne se conforme pas à l'une des syntaxes 'normales'.

+0

On dirait un truc quand même ... – pmod

+2

C'est fou et ça me donne de très mauvaises idées. Est-ce standard? Difficile de Google pour. – integer

+0

Oui, c'est la norme (clause [16.2.4]). J'ai édité ma réponse en conséquence. – hkaiser

1

Je ne pense pas que cela soit couvert par la norme C++, donc ce serait au vendeur du compilateur individuel de décider si oui ou non. Je ne pense pas faire. Cependant, à peu près tous les compilateurs vous permettent de spécifier un répertoire de recherche pour les en-têtes. C'est généralement l'option/i.

Il serait donc:

$ c++ -i build/generated-content main.cpp 
My main.cpp file: 

#include "header.h" 
void f() { /* something */ } 
Questions connexes