#if defined (x) || (y); это действительно? - программирование
Подтвердить что ты не робот

#if defined (x) || (y); это действительно?

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

#if defined(x) || y

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

4b9b3361

Ответ 1

Да, это действительно.

Вот что говорит стандарт (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).

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

Ответ 2

Обоснование этого двоякое.

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

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

Ответ 3

Да, поскольку defined(x) является логическим и возвращает true или false.

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

Ответ 4

это правильно, но это плохая практика. Зачем использовать две разные оценки ('y' и 'defined (x)') в одном условном выражении. Это может смутить других. В приведенном ниже примере показано более общее использование || и && операторы против #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 был undefined):

#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"