2009-10-05 14 views

Répondre

9

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 macro sur une ligne. Sinon, pour les conditions de définition de macro unique, elles 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. De plus, this ANSI C summary from 1987 listes #if defined que le comportement nouvellement défini pour le préprocesseur selon les normes ANSI - ce devrait être standard à travers tout compilateur compatible ANSI que vous utiliserez.

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

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

Aussi, the Redhat manual for the C preprocessor dit

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

+0

Ah, je pensais que c'était peut-être quelque chose comme ça, et j'expérimentais pendant que vous répondiez. :-) –

+0

Aussi, j'ai trouvé que #if! Defined (FOO) est le même que #ifndef FOO –

1

#ifdef est court pour #if défini et je pense que vous ne avez pas besoin entre parenthèses ni sur, donc en gros, ils sont les mêmes.

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

3

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

1

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

Questions connexes