# определено (х) || (у); это действительно?

Во время одного обзора я наткнулся на фрагмент кода, подобный следующему:

#if defined(x) || y

Что означает приведенное выше утверждение? Будет ли условие выполнено правильно?

 usr-local-ΕΨΗΕΛΩΝ30 мар. 2012 г., 17:37
казнить это не то слово. Этот код предварительно обрабатывается во время компиляции. Я не уверен в правильности синтаксиса, но он мог бы получитьоценивали но обычно правильным синтаксисом "#iffined (x)" является "#IFDEF x"

Ответы на вопрос(4)

defined(x) является логическим значением и возвращает true или false.

Вышеприведенное утверждение означает «либо x определен, либо y является истинным».

 phimuemue30 мар. 2012 г., 17:40
... или оба. :)

Вместо использования#ifdefВы используетеdefined оператор, так что вы можете использовать логические операторы на нем (&&, ||и т. д.), чтобы вам не приходилось дублировать код, чтобы он был правильно включен, если существует несколько критериев для определения того, что вам нужно определить.

Также,на мой взглядМне гораздо легче читать как#if defined(x) чем#ifdef xи вы могли бы сделать следующее#if defined(x) && defined(y)в то время как это невозможно с#ifdef.

Решение Вопроса

Вот что говорит Стандарт (C99) в 6.10p1:

if-group:
# if constant-expression new-line groupopt
# ifdef identifier new-line groupopt
# ifndef identifier new-line groupopt

defined оператор рассматривается как унарный оператор часть постоянного выражения (6.10.1p1).

В вашем примере условие оценивается как истинное, если макросx определяется ИЛИ, еслиy определяется и отличается от0

но это плохая практика. Зачем использовать две разные оценки («у» и «определенные (х)») в одном условном. Это может сбить с толку других. Пример ниже показывает более распространенное использование || и && операторы против #defined макросов:

#define AA  1
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

При запуске вышеуказанного кода пользователь получит эти сообщения на экране:

#warning "A or B"
#warning "A and B"

Но если код был таким (AA был неопределен):

#undefine AA
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

тогда пользователь получит это сообщение:

#warning "A or B"
 StarShine21 июн. 2017 г., 12:10
обратите внимание, что синтаксис, который вы здесь использовали, отличается: «определен х» вместо «определен (х)». оба дают одинаковый результат.

Ваш ответ на вопрос