2012-03-10 19 views
5

Per codice specifico compilatore, è comune vedere direttive CPP quali:C preprocessore macro - definizione vs. portabilità valore e la pratica

#if defined (__GNUC__) && (__GNUC__ >= 4)

che è la prova di preprocessore Io di solito uso - non esclusivamente per __GNUC__, ma è un esempio comune. In alternativa,

#if (__GNUC__ >= 4)

sembra soddisfare gli stessi requisiti. Ci sono potenziali problemi con quest'ultimo? Non solo con gcc, ma con qualsiasi preprocessore conforme agli standard. L'LHS può essere valutato come un certo valore, anche se non è definito? Ci sono delle insidie ​​nel secondo approccio che tutti gli avvocati di lingue sono a conoscenza?

risposta

5

Il preprocessore presuppone che i macro non definiti contengano il valore 0, pertanto in questo caso la semplificazione è corretta. Se vuoi verificare una versione inferiore a 4 in gcc, potresti avere dei problemi, dal momento che valuterà come true con un < anche se non è gcc.

Penso che il motivo per l'utilizzo di entrambi è anche una questione di comprensibilità, se controlli

#if defined(__GNUC__) && (__GNUC>=4) 

è piuttosto ovvio che sei non già in un blocco con il codice che è solo per GCC, mentre la semplificazione

#if (__GNUC__ >= 4) 

non fa così ovvio e può essere letto come un controllo di versione solo quando si sa già che è gcc.

+0

Assolutamente d'accordo sul fatto che la prima scelta sia migliore poiché rende l'intento più ovvio e non costa nulla. Evita anche "fall-through" potenzialmente scorretti in cui vengono valutati più casi di compilatore/piattaforma. –

2

Nel caso GNUC, quando si sta testando l'altro senso intorno, lo farà cosa sbagliata:

#if (__GNUC__ < 4) 

Penso che questo sarà vero anche se GNUC non è definito.

+1

+1, ottimo controesempio. –

Problemi correlati