2013-09-01 56 views
17

在LLVM項目source code of stdbool.h,它讀取:#define X X在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 

在過去的4線有從#define X X三條線。爲什麼要這麼做?它有什麼不同?難道這不會強制編譯器將true替換爲true

回答

19

我能想到的唯一原因是,像

#ifdef bool 
// do some stuff or define bool 
#endif 
在其他C文件

是預處理語句包括以後將工作正確的,而不是試圖重新定義布爾以另一種方式一樣

#define bool int 

這會干擾第一個定義

8
#define X X 

具有 「預處理器有條件的」 *效果:

#ifdef X 

是 「真」 「成功」。 *


*更新

+0

downvoter可能想評論? – alk

+1

不是我,但我猜想說一個預處理器指令是「真實的」讓你反對票。有些人堅持要求準確。 – john

+0

@john:我意識到這一點,這就是爲什麼我把它放在引號中。但是它是預處理環境中的布爾表達式,不是嗎?你有另一種措辭的想法嗎? – alk

2

這將使真的,假的等現在宏的差異。所以像這樣的代碼

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

會受到影響。

+0

你的意思是'#ifdef true' –

+3

@MilesRout'#ifdef true'和'#if defined(true)'是一樣的。 – john

+0

'#ifdef'更清晰,更短,更乾淨和標準的做法。 –

相關問題