0

stdint.h (newlib から) のこのブロックの目的は何ですか?

#if defined(__GNUC__) && \
  ( (__GNUC__ >= 4) || \
    ( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 2) ) )
/* gcc > 3.2 implicitly defines the values we are interested */
#define __STDINT_EXP(x) __##x##__

このマクロは、後で整数比較のためにヘッダーで使用されますが、どのように評価されるのかわかりません。例えば:

#if __STDINT_EXP(LONG_MAX) > 0x7fffffff
4

3 に答える 3

3

##トークンを連結する cpp (C プリプロセッサ) 演算子です。

#if __STDIN_EXP(LONG_MAX) > 0x7fffffff

に評価されます

#if __LONG_MAX__ > 0x7fffffff

最初のステップで。

于 2011-05-04T19:53:58.710 に答える
2

この##演算子は、C プリプロセッサに「連結」することを意味するため、その行は次のようになります。

#if __LONG_MAX__ > 0x7fffffff

特定のマシンで何が起こっているかを本当に知りたい場合は、プリプロセッサを実行して調べてください。

于 2011-05-04T19:51:28.913 に答える
1

プリプロセッサでは、##2 つのテキストを 1 つの大きなトークンに連結します。この特定のマクロは、識別子の両側にアンダースコアを平手打ちします。したがって、gcc 3.2 以降を使用している場合は、次のようになります。

#if __STDINT_EXP(LONG_MAX) > 0x7fffffff

これに変わります:

#if __LONG_MAX__ > 0x7fffffff
于 2011-05-04T19:51:12.763 に答える