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í.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top