【问题标题】:Why does GCC's __attribute__((...)) syntax use double parentheses?为什么 GCC 的 __attribute__((...)) 语法使用双括号?
【发布时间】:2011-11-12 19:21:12
【问题描述】:

documentation for GCC's __attribute__((...)) syntax 表示属性必须用双括号括起来,但没有给出此设计决策的理由。

什么实际原因会导致 GCC 的设计者要求这样做?跟预处理器对双括号的处理有关系吗?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    可能的想法是,您可以声明一个简单的宏,有助于在任何其他 C 和 C++ 编译器中忽略所有这些。如果您没有第二对括号,则该宏必然与... 是一个。所以对于不支持的编译器,你会被搞砸的。

    编辑:使用这种语法,它看起来就像

    #ifdef __GNUC__
    # define attribute(X) __attribute__(X)
    #else
    # define attribute(X)
    #endif
    

    然后您将使用attribute 进行函数声明,例如

    【讨论】:

    • 定义以双下划线开头的宏名称是未定义的行为。
    • @dreamlax,我知道。我没有说应该这样做,但我认为这就是它背后的想法。
    【解决方案2】:

    为了让不同的编译器更容易消除它。如果你有可移植的代码,你必须为其他编译器删除它们,所以你这样做

    #ifndef __GNUC__
    #define __attribute__(x)
    #endif
    

    问题是属性有不同数量的参数,你可以在一个__attribute__声明中组合多个属性,但是C在C99中只引入了可变参数宏。使用双括号,上述定义不需要可变参数宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多