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?

alka pandey
fuente

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
paxdiablo
fuente
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
Patrick Schlüter
fuente
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.

Rodders
fuente
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
-2

El código parece extraño porque los printf no están en ningún bloque de función.

hwx
fuente
1
todo el bloque puede estar dentro de una función. Y bienvenido a stackoverflow. Lea stackoverflow.com/help/how-to-answer .
rajashekar