2012-11-28 31 views
1

也許我錯過了一些東西,但可能有人請解釋下面的代碼背後的「邏輯」?在C++中混淆無數#ifndef語句(無值)的嵌套

#ifndef _PTRDIFF_T 
#ifndef _T_PTRDIFF_ 
#ifndef _T_PTRDIFF 
#ifndef __PTRDIFF_T 
#ifndef _PTRDIFF_T_ 
#ifndef _BSD_PTRDIFF_T_ 
#ifndef ___int_ptrdiff_t_h 
#ifndef _GCC_PTRDIFF_T 
#define _PTRDIFF_T 
#define _T_PTRDIFF_ 
#define _T_PTRDIFF 
#define __PTRDIFF_T 
#define _PTRDIFF_T_ 
#define _BSD_PTRDIFF_T_ 
#define ___int_ptrdiff_t_h 
#define _GCC_PTRDIFF_T 
#ifndef __PTRDIFF_TYPE__ 
#define __PTRDIFF_TYPE__ long int 
#endif 
typedef __PTRDIFF_TYPE__ ptrdiff_t; 
#endif /* _GCC_PTRDIFF_T */ 
#endif /* ___int_ptrdiff_t_h */ 
#endif /* _BSD_PTRDIFF_T_ */ 
#endif /* _PTRDIFF_T_ */ 
#endif /* __PTRDIFF_T */ 
#endif /* _T_PTRDIFF */ 
#endif /* _T_PTRDIFF_ */ 
#endif /* _PTRDIFF_T */ 

爲什麼這優於簡單的:

#ifndef xyz 
#define xyz 
#endif 

???

我可以看到它們是嵌套的,但它很混亂。 ...和順便說一句,他們定義了什麼,因爲在標識符後沒有任何值?

回答

2

邏輯是隻定義宏,如果他們都不是defiend。不過,我一定會重構它分爲:

#if !defined(_PTRDIFF_T) && !defined(_T_PTRDIFF_) && //... well, you get the idea 
    #define _PTRDIFF_T 
    #define _T_PTRDIFF_ 
    //... 
    #ifndef __PTRDIFF_TYPE__ 
    #define __PTRDIFF_TYPE__ long int 
    #endif 
    typedef __PTRDIFF_TYPE__ ptrdiff_t; 
#endif 

至於第二個問題:你可以定義一個宏沒有替換文本(如果使用它只是擴展到什麼)。這些宏通常用於有條件地包含基於#ifdef#ifndef的代碼。

+0

是的,我喜歡你的重構好得多!因此,在執行'#define'操作之前,所有'#ifndef'條目都必須爲TRUE? – Les

+0

是的,因爲它們是嵌套的。只要其中一個失敗(即,其中一個宏已經定義),所有匹配'#endif'的內容都會被跳過。關於嵌套,它就像正常的'if's一樣工作。 – Angew

0

他們正在檢查所有這些標識符是否已被定義,哪些標識符位於其他已包含的標頭中。如果他們都定義了,那麼我們定義一些新的標識符。

您不需要給標識符賦值,例如,您不會爲#include警衛提供值。

+0

我對代碼的嵌套風格與離散的#ifndef-#endif塊有更多的瞭解。另外,據我瞭解,當你使用沒有值的'#define'時,你正在清除任何以前設置的值,是true? – Les

+0

@Les如果'#define X Y'(其中'Y'可以爲空)並且'X'已經被定義爲'Y',則什麼都不會發生。如果它被定義爲「Y」以外的任何東西,那就是錯誤。 – Angew

+0

否則,你會使用'#undef'正確嗎? – Les