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

2 番目の質問については、置換テキストなしでマクロを定義できます (使用すると何も展開されないだけです)。#ifdefこのようなマクロは、またはに基づくコードを条件付きで含めるためによく使用されます#ifndef

于 2012-11-28T19:33:32.260 に答える
0

彼らは、これらのすべての識別子が定義されていることを確認しています。これは、既に含まれている他のヘッダーにあります。それらがすべて定義されている場合は、いくつかの新しい識別子を定義します。

識別子に値を与える必要はありません。たとえば、 #include ガードに値を与えることはありません。

于 2012-11-28T18:54:58.843 に答える