# si está definido (x) || (y); esto es valido?

Durante una revisión encontré un fragmento de código como el siguiente:

#if defined(x) || y 

¿Qué significa la statement anterior? ¿La condición se ejecutará correctamente?

Si es valido

Esto es lo que dice el Estándar (C99) en 6.10p1:

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

el operador defined se ve como parte unitaria del operador de una expresión constante (6.10.1p1).

En su ejemplo, la condición se evalúa como verdadera si la macro x está definida O si y está definida y es diferente de 0

El razonamiento para esto es doble.

En lugar de usar un #ifdef , usa el operador defined para poder usar operadores lógicos en él ( && , || , etc.), para no tener que duplicar su código para que se incluya correctamente si existe Es múltiples criterios para lo que necesitas definir.

También, en mi opinión , me parece mucho más fácil leer como #if defined(x) que #ifdef x , y podría hacer lo siguiente #if defined(x) && defined(y) , mientras que eso no es posible con #ifdef .

Sí, ya que defined(x) es un valor booleano y devuelve verdadero o falso.

La statement anterior significa “o bien x está definido o y es verdadera”.

Es correcto pero es una mala práctica. ¿Por qué usar dos evaluaciones diferentes (‘y’ y ‘definido (x)’) en un condicional? Puede ser confuso para los demás. El siguiente ejemplo muestra un uso más común de || y && operatiors contra las macros definidas:

 #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 

Cuando se ejecutó el código anterior, el usuario obtendría estos mensajes en la pantalla:

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

Pero si el código era así (AA no estaba definido):

 #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 

entonces el usuario recibirá este mensaje:

 #warning "A or B"