#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?
fuente
#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?
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
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
"# 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.
fuente