C Препроцессор тестирует определенность нескольких макросов - PullRequest
42 голосов
/ 08 июня 2009

Я искал сайт, но не нашел ответ, который искал, поэтому вот очень быстрый вопрос.

Я пытаюсь сделать что-то подобное:

#ifdef _WIN32 || _WIN64
     #include <conio.h>
#endif

Как я могу сделать такую ​​вещь? Я знаю, что _WIN32 определен как для 32-, так и для 64-битных окон, поэтому я бы согласился с любым из них для обнаружения окон. Меня больше интересует, могу ли я использовать логические операторы, подобные этим, с директивами препроцессора, и если да, то как, поскольку вышеприведенное не работает.

При компиляции с gcc я получаю:

предупреждение: дополнительные токены в конце директивы #ifdef, и она в основном просто берет первый MACRO и игнорирует остальные.

Ответы [ 5 ]

66 голосов
/ 08 июня 2009

Попробуйте:

#if defined(_WIN32) || defined(_WIN64)
// do stuff
#endif

Макрос определенный проверяет, определено имя или нет, и позволяет применять логические операторы к результату.

7 голосов
/ 08 июня 2009

Вы должны использовать #if и специальный оператор defined

5 голосов
/ 08 июня 2009

Вы должны использовать «если определено», а не «ifdef»

#if defined _WIN32 || defined _WIN64

Упс, опечатка, вам нужно второе 'определено', поэтому ваш тест не пройден. Думайте об этом как об «определенном _WIN32» как об одном выражении, возвращающем истину / ложь

4 голосов
/ 08 июня 2009

Я думаю, что это должно быть возможно так:

#if defined block1 || defined block2 /*or any other boolean operator*/
   /*Code*/
#endif

Подробнее здесь

1 голос
/ 08 июня 2009

Использование определено:

#if defined(A) || defined(B)
    #include <whatever.h>
#endif
...