2013-09-01 11 views
17

Im source code of stdbool.h in LLVM-Projekt, es lautet:Welchen Effekt hat #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 

In den letzten 4 Zeilen dort aus #define X X drei Zeilen die sind. Warum würdest du das tun? Welchen Unterschied macht es? Wäre nicht diese Kraft Compiler nur zu ersetzen, sagen wir, true mit true?

Antwort

19

Der einzige Grund, warum ich denken kann, dass Präprozessoranweisungen wie

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

in anderen c-Dateien danach umfassen funktionieren ordnungsgemäß und nicht Bool in einer anderen Art und Weise wie

#define bool int 

neu zu definieren versucht, die mit der ersten Definition würde stören

8
#define X X 

hat die Wirkung, dass "der Vorprozessor bedingten" *:

#ifdef X 

"wahr" "erfolgreich". *


* Update

+0

die downvoter könnten einen Kommentar abgeben? – alk

+1

Ich nicht, aber ich würde sagen, dass eine Präprozessordirektive "wahr" ist, haben Sie die Abstimmung unten. Manche Leute sind Verfechter der Genauigkeit. – john

+0

@john: Ich war mir dessen bewusst, deshalb setze ich es in Anführungszeichen. Es ist jedoch ein boolescher Ausdruck im Kontext der Vorverarbeitung, oder? Haben Sie eine Idee für eine alternative Formulierung? – alk

2

Es den Unterschied machen würde, die wahr, falsch etc jetzt Makros sind. Also Code wie dieser

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

würde betroffen sein.

+0

Sie meinen '#ifdef true' –

+3

@MilesRout' #IFDEF true' und '#if defined (true)' sind die gleichen. – john

+0

'# ifdef' ist klarer, kürzer, sauberer und Standard-Praxis. –

Verwandte Themen