2010-04-07 5 views
4

Dans un en-tête pré-compilé si je fais:#define et comment les utiliser - C++

#define DS_BUILD 
#define PGE_BUILD 
#define DEMO 

puis dans la source que je fais:

#if (DS_BUILD && DEMO) 
    ---- code--- 
#elif (PGE_BUILD && DEMO) 
    --- code--- 
#else 
    --- code --- 
#endif 

Est-ce que je reçois une erreur qui indique:

error: operator '&&' has no right operand

Je n'avais jamais vu ça auparavant. J'utilise XCode 3.2, GCC 4.2 sur OS X 10.6.3

Répondre

13

Vous devez ajouter le mot-clé defined puisque vous voulez vérifier que vous avez défini ont été définis.

#if defined (DS_BUILD) && defined (DEMO) 
    ---- code--- 
#elif defined (PGE_BUILD) && defined (DEMO) 
    --- code--- 
#else 
    --- code --- 
#endif 
+0

vous pouvez #define DEMO 1 –

4

Vous devez d'abord décider comment vous voulez utiliser vos macros de compilation conditionnelles. Il y a normalement deux approches populaires. Il est soit

#define A 
#define B 

#ifdef A 
... 
#endif 

#if defined(A) && defined(B) 
... 
#endif 

ou

#define A 1 
#define B 0 

#if A 
... 
#endif 

#if A && B 
... 
#endif 

à savoir soit simplement définir une macro et l'analyser avec #ifdef et/ou #if defined() ou définir une macro pour une valeur numérique et analyser si avec #if.

Vous mélangez ces deux approches dans votre échantillon de code, ce qui n'a généralement aucun sens. Décidez quelle approche vous voulez utiliser et respectez-la.

2

L'effet de #define DEMO est que pendant prétraiter chaque occurence de DEMO est remplacé par rien (''). La même chose avec #define PGE_BUILD. Donc, dans le deuxième échantillon que vous avez posté vous obtenez effectivement #elif (&&) qui, vous êtes d'accord, n'a pas beaucoup de sens pour le compilateur :).

1

Vous devez fournir des valeurs pour DS_BUILD, PGE_BUILD et DEMO, ou vous devez utiliser ifdef

#define DS_BUILD 1 
#define PGE_BUILD 1 
#define DEMO 1 

définissant comme ci-dessus ne pouvez travailler