2010-04-07 3 views
4

C++ В предварительно скомпилированных заголовке, если я:#define и как их использовать -

#define DS_BUILD 
#define PGE_BUILD 
#define DEMO 

то в источнике я:

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

ли я получаю сообщение об ошибке говорится:

error: operator '&&' has no right operand

Я никогда раньше этого не видел. Я использую XCode 3.2, GCC 4.2 на OS X 10.6.3

ответ

13

Вам нужно добавить ключевое слово defined, так как вы хотите проверить, что вы определили.

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

В качестве альтернативы вы можете #define DEMO 1 –

4

Вы должны сначала решить, как использовать макросы условной компиляции. Обычно есть два популярных подхода. Это либо

#define A 
#define B 

#ifdef A 
... 
#endif 

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

или

#define A 1 
#define B 0 

#if A 
... 
#endif 

#if A && B 
... 
#endif 

Т.е. либо просто определите макрос и проанализируйте его с помощью #ifdef и/или #if defined() или определите макрос для численного значения и проанализируйте, если с #if.

Вы смешиваете эти два подхода в своем примере кода, что обычно не имеет смысла. Решите, какой подход вы хотите использовать и придерживайтесь.

2

Эффект #define DEMO является то, что во время предварительной обработки всех вхождений DEMO заменяется ничего (''). То же самое с #define PGE_BUILD. Итак, во втором примере, который вы опубликовали, вы действительно получаете #elif (&&), который, вы согласитесь, не имеет смысла для компилятора :).

1

Вы должны предоставить значения для DS_BUILD, PGE_BUILD и DEMO, или вам нужно использовать IFDEF

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

, определяющий, как выше будет работать

 Смежные вопросы

  • Нет связанных вопросов^_^