1

也许我遗漏了一些东西,但有人可以解释一下以下代码背后的“逻辑”吗?

#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

???

我可以看到它们是嵌套的,但这很混乱。...顺便说一句,他们在定义什么,因为标识符后面没有值???

4

2 回答 2

2

逻辑是仅在没有一个宏被拒绝时才定义宏。但是,我肯定会将其重构为:

#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

至于第二个问题:您可以定义一个没有替换文本的宏(如果使用它只会扩展为空)。此类宏通常用于有条件地包含基于#ifdefor的代码#ifndef

于 2012-11-28T19:33:32.260 回答
0

他们正在检查所有这些标识符是否已定义,这些标识符将在其他已包含的标头中。如果它们都被定义了,那么我们定义一些新的标识符。

你不需要给标识符赋值,例如你不会给你的#include 守卫赋值。

于 2012-11-28T18:54:58.843 回答