我有以下宏:
#define GTR(type) \
type type##_gtr(type a, type b) \
{ \
return a > b ? a : b;\
}
我知道它会生成函数,但是如果GTR(unsigned int)
向外扩展main()
,我该如何调用生成的函数?_gtr(a, b)
不工作...
您必须编写unsigned int_gtr(a,b)
它,使其不适用于您创建的宏定义的该类型。
原因是预处理器只是简单地替换了type
参数并将其连接到## 之后的文本中。
你可以做一些事情,比如为 unisgned int 创建一个 typedef,这样就没有空格,然后使用它,例如:
typedef unsigned int uint;
GTR(uint)
...
uint_gtr(a,b)
这:
type##_gtr
宏内部将type
参数的值与文本粘合在一起_gtr
。这发生在返回类型和参数列表的左括号之间,即这形成了函数的名称。
所以如果你使用GTR(unsigned int)
,你会失败,因为完整的函数原型最终看起来像这样:
unsigned int unsigned int_gtr(unsigned int a, unsigned int b)
这在语法上是不正确的。基本上,宏有一个弱点,它假定类型名称不能包含空格,这在 C 中是不正确的。
但是,如果您使用GTR(unsigned)
,则应将其称为unsigned_gtr()
。
GTR(unsigned)
将扩展为:
unsigned unsigned_gtr(unsigned a, unsigned b)
{
return a > b ? a : b;
}
在这种情况下,您应该调用unsigned_gtr(a, b)
.
GTR(unsigned int)
但是,会因语法错误而失败,因为您有两个单独的标记,并且无法正确生成函数的名称。