¿Cuál es la diferencia entre estas directivas del compilador?
-
19-09-2019 - |
Pregunta
Lo que, en todo caso, es la diferencia entre estas directivas?
#ifdef FOO
#if defined FOO
#if defined(FOO)
Estoy usando el compilador CCS, pero estoy interesado en otras C compiladores así.
Solución
Por lo que he visto, el principal uso de #if defined
es hacer un cheque por múltiples definiciones de macros en una línea. De lo contrario, para los condicionales individuales de definición de macro, que son idénticos por lo que yo sé.
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ tcc -DFOO -run a.c nothing. $ tcc -DBAR -run a.c nothing. $ tcc -DFOO -DBAR -run a.c foobar!
Además, el programa anterior compila bien con gcc -Wall -ansi a.c
para que sugiere #if defined
es correcta ANSI C. Por otra parte, este resumen ANSI C a partir de 1987 enumera #if defined
como un comportamiento que acaba de definir para el preprocesador bajo los estándares ANSI - este debe ser estándar en cualquier compilador compatible con ANSI que va a utilizar.
Si no se está usando #if defined
, que tendría que hacer
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
Además, el manual de RedHat para el preprocesador de C dice
#if defined MACRO
es precisamente equivalente a#ifdef MACRO
.
Otros consejos
Todas las 3 formas son exactamente equivalentes y válido, de acuerdo con el estándar C99. En general se prefiere #ifdef
porque es más corta que las otras dos formas, pero hay situaciones en las que se desea utilizar las otras formas:
-
Si la prueba para las definiciones de varios símbolos o expresiones más complejas:
#if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4) ... #endif
-
Si tiene varias cláusulas, es mucho más fácil de usar que
#elif defined(...)
#else
,#ifdef
:#if defined(ONE_THING) ... #elif defined(ANOTHER_THING) ... #elif defined(THIRD_THING) ... #else ... #endif
El uso de paréntesis con defined
es opcional; Yo prefiero usarlos para añadir claridad.
#ifdef es la abreviatura de #if defined y creo que no es necesario paréntesis sobre ninguno de ellos, así que básicamente son los mismos.
Viniendo de Turbo C, estoy acostumbrado a mirar a #ifdef en lugar de #if defined
Originalmente sólo había #ifdef
, pero cuando llegó #if
era necessay tener defined()
con el fin de #if
a superconjunto #ifdef
.