【问题标题】:How are hashes evaluated by gcc's preprocessor?gcc 的预处理器如何评估哈希值?
【发布时间】:2011-05-04 19:45:57
【问题描述】:

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

【问题讨论】:

    标签: c gcc c-preprocessor string-concatenation stringification


    【解决方案1】:

    ## 是连接标记的 cpp(C 预处理器)运算符,即。

    #if __STDIN_EXP(LONG_MAX) > 0x7fffffff
    

    评估为

    #if __LONG_MAX__ > 0x7fffffff
    

    在第一步中。

    【讨论】:

    • 未来读者请注意:cpp 是 c 预处理器,不要与以 .cpp 结尾的 c++ 源代码混淆
    【解决方案2】:

    ## 运算符意味着“连接”到 C 预处理器,因此该行相当于:

    #if __LONG_MAX__ > 0x7fffffff
    

    如果您真的想知道给定机器上发生了什么,请通过预处理器运行它并找出答案。

    【讨论】:

    • 不过,__STDINT_EXP(LONG_MAX) 的扩展不会出现在预处理的源代码中。
    • @mmutz:嗯,它有点愿意。在我的机器上看起来像9223372036854775807L。也就是说,如果它不在 #if 块中,就像它在那里一样。
    【解决方案3】:

    在预处理器中## 将两段文本连接成一个更大的标记。这个特殊的宏在标识符的每一边都带有下划线,所以如果你使用的是 gcc 3.2 或更高版本:

    #if __STDINT_EXP(LONG_MAX) > 0x7fffffff
    

    变成这样:

    #if __LONG_MAX__ > 0x7fffffff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2016-10-25
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      相关资源
      最近更新 更多