2013-09-01 15 views
17

Nel source code of stdbool.h al progetto LLVM, si legge:Che effetto ha #define X X in C?

/* Don't define bool, true, and false in C++, except as a GNU extension. */ 
#ifndef __cplusplus 
#define bool _Bool 
#define true 1 
#define false 0 
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) 
/* Define _Bool, bool, false, true as a GNU extension. */ 
#define _Bool bool 
#define bool bool 
#define false false 
#define true true 
#endif 

Nelle ultime 4 righe ci sono tre linee della da #define X X. Perché dovresti farlo? Che differenza fa? Non forzerebbe questo compilatore a sostituire, per esempio, true con true?

risposta

19

L'unico motivo che mi viene in mente è che le dichiarazioni del preprocessore come

#ifdef bool 
// do some stuff or define bool 
#endif 

in altri file c includono poi lavoreranno corretta e non cercando di ridefinire bool in un altro modo, come

#define bool int 

che interferirebbe con la prima definizione

8
#define X X 

ha l'effetto che "il pre-processore condizionale" *:

#ifdef X 

è "vero" "riesce". *


* aggiornamento

+0

Il downvoter potrebbe voler commentare? – alk

+1

Non io, ma direi che una direttiva per il preprocessore è "vera" e ti ha fatto scendere il voto. Alcune persone sono pignoli per la precisione. – john

+0

@john: ero consapevole di questo, è per questo che l'ho messo tra virgolette. Tuttavia è un'espressione booleana nel contesto della pre-elaborazione, non è vero? Hai un'idea per una formulazione alternativa? – alk

2

Sarebbe fare la differenza che la vera, falsa ecc sono ora le macro. Quindi codice come questo

#if defined(true) 
    ... 
#else 
    ... 
#endif 

sarebbe interessato.

+0

Vuoi dire '#ifdef true' –

+3

@MilesRout' #ifdef true' e '#if defined (true)' sono gli stessi. – john

+0

'# ifdef' è più chiaro, più breve, più pulito e pratica standard. –