#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
En esto, ¿cuál es el papel de #ifdef
y #ifndef
, y cuál es el resultado?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
En esto, ¿cuál es el papel de #ifdef
y #ifndef
, y cuál es el resultado?
Respuestas:
El preprocesador dejará o eliminará el texto dentro de uno ifdef/endif
o un ifndef/endif
par , según la condición. ifdef
significa "si lo siguiente está definido" mientras que ifndef
significa "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 one
se define entonces el ifdef
es verdadero y el ifndef
es 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 ifdef
no se elimina ya que one
está definido. El texto después del ifndef
se elimina por el mismo motivo. Será necesario que haya dos endif
lí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
Alguien debería mencionar que en la pregunta hay una pequeña trampa. #ifdef
solo verificará si el siguiente símbolo ha sido definido vía #define
o 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 #if
es 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 defined
permite obtener el comportamiento deseado.
#if defined(one)
es por tanto equivalente a #ifdef
La ventaja de la #if
construcción es que permite un mejor manejo de las rutas de código, intente hacer algo así con el antiguo #ifdef
/ #ifndef
par.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"# 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.
El código parece extraño porque los printf no están en ningún bloque de función.