2012-03-30 22 views
16

Durante una opinión me encontré con un pedazo de código como el siguiente:#if defined (x) || (y); es esto valido?

#if defined(x) || y 

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

+0

* Execute * no es la palabra correcta. Ese código es preprocesado en tiempo de compilación. No estoy seguro de la corrección de la sintaxis, pero a lo sumo podría * evaluarse *, pero por lo general la sintaxis correcta de "#if defined (x)" es "#IFDEF x" –

Respuesta

20

Sí, es válido.

Aquí es lo que el estándar (C99) dice en 6.10p1:

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

el operador defined es visto como parte operador unitario de una expresión constante (6.10.1p1).

En su ejemplo, la condición se evalúa como VERDADERO si se define la macro x o si se define y y diferente que 0

3

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

La declaración anterior significa "x está definido o y es verdadero".

+5

... o ambas cosas. :) – phimuemue

10

El razonamiento de esto es doble.

En lugar de utilizar un #ifdef, se utiliza el operador defined para que pueda utilizar los operadores lógicos en el mismo (&&, ||, etc.), de modo que usted no tiene que duplicar su código para que se incluye adecuadamente si hay múltiples criterios para lo que necesita definir.

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

1

es correcto, pero es una mala práctica. ¿Por qué utilizar dos evaluaciones diferentes ('y' y 'defined (x)') en un condicional. Puede ser confuso para otros. El siguiente ejemplo muestra un uso más común de || y & & operatiors contra macros #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 

Cuando el código anterior se realizó usuario podría obtener estos mensajes en la pantalla:

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

Pero si el código era así (AA fue 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" 
+0

tenga en cuenta que la sintaxis que utilizó aquí es diferente: "definido x" en lugar de "definido (x)". ambos producen el mismo resultado. – StarShine

Cuestiones relacionadas