El papel de #ifdef y #ifndef


99
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

En esto, ¿cuál es el papel de #ifdefy #ifndef, y cuál es el resultado?

Respuestas:


131

El preprocesador dejará o eliminará el texto dentro de uno ifdef/endifo un ifndef/endif par , según la condición. ifdefsignifica "si lo siguiente está definido" mientras que ifndefsignifica "si lo siguiente no está definido".

Entonces:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

es equivalente a:

printf("one is defined ");

ya que onese define entonces el ifdefes verdadero y el ifndefes falso. No importa lo que se define como . Un fragmento de código similar (mejor en mi opinión) a eso sería:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

ya que eso especifica la intención más claramente en esta situación particular.

En su caso particular, el texto después de ifdefno se elimina ya que oneestá definido. El texto después del ifndef se elimina por el mismo motivo. Será necesario que haya dos endiflíneas de cierre en algún punto y la primera hará que las líneas comiencen a incluirse nuevamente, de la siguiente manera:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif

68

Alguien debería mencionar que en la pregunta hay una pequeña trampa. #ifdefsolo verificará si el siguiente símbolo ha sido definido vía #defineo por línea de comando, pero su valor (su sustitución de hecho) es irrelevante. Incluso podrías escribir

#define one

los precompiladores lo aceptan. Pero si lo usas #ifes otra cosa.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

dará one does not evaluate to truth. La palabra clave definedpermite obtener el comportamiento deseado.

#if defined(one) 

es por tanto equivalente a #ifdef

La ventaja de la #ifconstrucción es que permite un mejor manejo de las rutas de código, intente hacer algo así con el antiguo #ifdef/ #ifndefpar.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300

0

"# si uno" significa que si se ha escrito "# definir uno", se ejecuta "# si uno", de lo contrario se ejecuta "# si uno".

Esta es solo la directiva de preprocesador C (CPP) equivalente a las declaraciones de rama if, then, else en el lenguaje C.

es decir, si {#define one} then printf ("uno se evalúa como verdad"); else printf ("uno no está definido"); por lo que si no hay una declaración #define, se ejecutará la rama else de la declaración.


4
No estoy seguro de qué agrega esto que las otras respuestas aún no cubren, y su ejemplo no es C o C ++.
SirGuy

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.