Domanda

Che cosa, se non altro, è la differenza tra queste direttive?

#ifdef FOO

#if defined FOO

#if defined(FOO)

Sto usando il compilatore CCS, ma io sono interessato ad altri C compilatori pure.

È stato utile?

Soluzione

Da quello che ho visto, l'uso principale per #if defined è quello di fare un controllo per più definizioni di macro su una linea. In caso contrario, per i condizionali singola definizione di macro, sono identici per quanto ne so.

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

Inoltre, il programma sopra compila bene con gcc -Wall -ansi a.c modo che suggerisce #if defined sia corretto ANSI C. Inoltre, questa sintesi ANSI C dal 1987 elenca #if defined come un comportamento di nuova definizione per il preprocessore in conformità agli standard ANSI - questa dovrebbe essere di serie su tutta qualsiasi compilatore ANSI-compliant si intende utilizzare.

Se non si sta utilizzando #if defined, dovreste fare

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

Inoltre, manuale Redhat per la C preprocessore dice

  

#if defined MACRO è proprio equivalente a #ifdef MACRO.

Altri suggerimenti

Tutte le 3 forme sono esattamente equivalenti e valida, secondo lo standard C99. Generalmente #ifdef è preferito perché è più breve rispetto alle altre due forme, ma ci sono situazioni in cui si desidera utilizzare le altre forme:

  • Se il test per le definizioni di più simboli, o espressioni più complesse:

    #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
    ...
    #endif
    
  • Se si dispone di più clausole, è molto più facile da usare rispetto #elif defined(...) #else, #ifdef:

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

L'uso delle parentesi con defined è facoltativo; Io preferisco che li utilizzano per aggiungere chiarezza.

#ifdef è l'abbreviazione di #if defined e penso che non hai bisogno di parentesi su nessuno dei due, in modo sostanzialmente sono la stessa cosa.

Per chi proviene da Turbo C, io sono abituato a guardare #ifdef , piuttosto che #if defined

In origine c'era solo #ifdef, ma quando è arrivato #if era necessay avere defined() in ordine per #if a superset #ifdef.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top