繁体   English   中英

使用C中的宏生成函数

[英]Generate functions using Macros in C

我有以下宏:

‎#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)会因语法错误而失败,因为您有两个单独的标记,并且无法正确生成函数的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM