c-preprocessor - para - que es#ifdef en c
El rol de#ifdef y#ifndef (3)
"#if one" significa que si se ha escrito "#define one" "#if one" se ejecuta de lo contrario "#ifndef one" se ejecuta.
Esto es simplemente el equivalente de la Directiva Preprocesador (CPP) de las declaraciones de ramificación if, then else en el lenguaje C.
es decir, si {#define one} luego printf ("uno evalúa a verdad"); else printf ("uno no está definido"); por lo tanto, si no hubiera una sentencia #define one, se ejecutaría la rama else de la instrucción.
#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?
Alguien debería mencionar que en la pregunta hay una pequeña trampa. #ifdef
solo comprobará si el siguiente símbolo se ha definido mediante #define
o por línea de comando, pero su valor (su sustitución, de hecho) es irrelevante. Incluso podrías escribir
#define one
precompiladores aceptan eso. Pero si usa #if
si 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 lo tanto equivalente a #ifdef
La ventaja de la construcción #if
es permitir un mejor manejo de las rutas de código, intenta hacer algo como eso con el viejo par #ifdef
/ #ifndef
.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
El ifndef/endif
dejará o eliminará el texto dentro de un par ifndef/endif
ifdef/endif
o ifndef/endif
dependiendo de la condición. ifdef
significa "si se define lo siguiente" mientras que ifndef
significa "si lo siguiente no está definido".
Asi que:
#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 así que el ifdef
es verdadero y el ifndef
es falso. No importa lo que se define como . Una pieza 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 del ifdef
no se elimina ya que one
está definido. El texto después del ifndef
se elimina por el mismo motivo. endif
haber dos líneas de cierre endif
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