Question

Qu'est-ce que, si quelque chose, est la différence entre ces directives?

#ifdef FOO

#if defined FOO

#if defined(FOO)

J'utilise le compilateur CCS, mais je suis intéressé par d'autres C compilateurs ainsi.

Était-ce utile?

La solution

D'après ce que j'ai vu, la principale utilisation de #if defined est de faire un chèque de plusieurs définitions de macros sur une seule ligne. Dans le cas contraire, pour conditionals définition macro unique, ils sont identiques pour autant que je sache.

#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!

En outre, le programme ci-dessus compile bien avec gcc -Wall -ansi a.c de sorte que suggère #if defined est correcte ANSI C. En outre, ce résumé ANSI C de 1987 liste #if defined comme un comportement nouvellement défini pour le préprocesseur selon les normes ANSI - ce devrait être standard dans tout compilateur conforme à la norme ANSI-vous utiliserez.

Si vous n'utilisez pas #if defined, vous auriez à faire

#ifdef FOO
#ifdef BAR
    printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */

En outre, le manuel Redhat pour le C préprocesseur dit

  

#if defined MACRO est précisément équivalente à #ifdef MACRO.

Autres conseils

Les 3 formes sont exactement équivalentes et valides, selon la norme C99. En général, #ifdef est préféré car il est plus court que les deux autres formes, mais il y a des situations où vous voulez utiliser les autres formes:

  • Si le test pour les définitions de multiples symboles, ou des expressions plus complexes:

    #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
    ...
    #endif
    
  • Si vous avez plusieurs clauses, il est beaucoup plus facile à utiliser que #elif defined(...) #else, #ifdef:

    #if defined(ONE_THING)
    ...
    #elif defined(ANOTHER_THING)
    ...
    #elif defined(THIRD_THING)
    ...
    #else
    ...
    #endif
    

L'utilisation de parenthèses avec defined est facultative; Je préfère les utiliser pour ajouter de la clarté.

#ifdef est l'abréviation de #if defined et je pense que vous n'avez pas besoin entre parenthèses ni sur, donc en gros, ils sont les mêmes.

En venant de Turbo C, je suis habitué à regarder #ifdef plutôt que #if defined

A l'origine il n'y avait que #ifdef, mais quand #if est venu, il était necessay d'avoir defined() pour que #if à surensemble #ifdef.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top