Во время одного обзора я наткнулся на фрагмент кода, например:
#if defined(x) || y
Что означает вышеуказанное утверждение? Правильно ли будет выполнено условие?
Во время одного обзора я наткнулся на фрагмент кода, например:
#if defined(x) || y
Что означает вышеуказанное утверждение? Правильно ли будет выполнено условие?
Да, это действительно.
Вот что говорит стандарт (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
Обоснование этого двоякое.
Вместо использования #ifdef
вы используете оператор defined
, чтобы вы могли использовать на нем логические операторы (&&
, ||
и т.д.), так что вам не нужно дублировать свои код, чтобы он был включен правильно, если существует несколько критериев для того, что вам нужно определить.
Кроме того, на мой взгляд, мне гораздо легче читать как #if defined(x)
, чем #ifdef x
, и вы можете сделать следующее #if defined(x) && defined(y)
, тогда как это невозможно с #ifdef
.
Да, поскольку defined(x)
является логическим и возвращает true или false.
Вышеприведенное утверждение означает, что "либо x определено, либо y истинно".
это правильно, но это плохая практика. Зачем использовать две разные оценки ('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"