Qual è la differenza tra queste le direttive del compilatore?
-
19-09-2019 - |
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.
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
.