【问题标题】:Generate functions using Macros in C使用 C 中的宏生成函数
【发布时间】:2012-07-04 23:36:05
【问题描述】:

我有以下宏:

‎#define GTR(type) \‎
type type##_gtr(type a, type b) \‎
‎{ \‎
‎   return a > b ? a : b;\‎
‎}‎

我知道它会生成函数,但是如果GTR(unsigned int) 扩展到main() 之外,如何调用生成的函数? _gtr(a, b) 不起作用...

【问题讨论】:

  • 顺便说一句,标准C不允许void main()。你应该改用int main()

标签: c function macros


【解决方案1】:

这个:

type##_gtr

宏内部将type 参数的值与文本_gtr 粘合在一起。这发生在返回类型和参数列表的左括号之间,即它构成了函数的名称。

所以如果你使用GTR(unsigned int),你会失败,因为完整的功能原型最终看起来像这样:

unsigned int unsigned int_gtr(unsigned int a, unsigned int b)

这在语法上是不正确的。基本上,宏的弱点在于它假定类型名称不能包含空格,这在 C 中是不正确的。

如果您使用GTR(unsigned),则应将其称为unsigned_gtr()

【讨论】:

    【解决方案2】:

    GTR(unsigned) 将扩展为:

    unsigned unsigned_gtr(unsigned a, unsigned b)
    {
    ‎   return a > b ? a : b;
    }‎
    

    在这种情况下,您应该致电unsigned_gtr(a, b)

    但是,GTR(unsigned int) 会因语法错误而失败,因为您有两个单独的标记并且无法正确生成函数的名称。

    【讨论】:

      【解决方案3】:

      您必须写unsigned int_gtr(a,b),这样它就不适用于您创建的宏定义的类型。

      原因是预处理器只是简单地替换了type 参数并将其连接到## 之后的文本中。

      您可以为 unisgned int 创建一个 typedef,这样就没有空格,然后使用它,例如:

      typedef unsigned int uint;
      GTR(uint)
      ...
      uint_gtr(a,b)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        相关资源
        最近更新 更多