2

我有以下宏:

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

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

4

3 回答 3

4

您必须编写unsigned int_gtr(a,b)它,使其不适用于您创建的宏定义的该类型。

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

你可以做一些事情,比如为 unisgned int 创建一个 typedef,这样就没有空格,然后使用它,例如:

typedef unsigned int uint;
GTR(uint)
...
uint_gtr(a,b)
于 2012-07-04T12:54:21.973 回答
3

这:

type##_gtr

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

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

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

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

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

于 2012-07-04T12:54:42.770 回答
3

GTR(unsigned)将扩展为:

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

在这种情况下,您应该调用unsigned_gtr(a, b).

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

于 2012-07-04T12:56:22.387 回答