在很多开源代码中都有通过宏定义生成函数的用法,刚开始看这些代码的时候,还有点不习惯,经常找不到函数定义的地方,后来看的多了就好了。下面欣赏一段 spec 中的用法。
#include <stdio.h>
#define RETURN_TYPE int
#define ARGUMENTS void
#define OVERLOADABLE_CALL CCTK_
#define OVERLOADABLE_PREFIX CCTK_
#define OVERLOADABLE_DUMMY_PREFIX CCTKi_Dummy
#define OVERLOADABLE_FUNCTION(name) \
_OVERLOADABLE_FUNCTION(OVERLOADABLE_CALL,OVERLOADABLE_PREFIX, OVERLOADABLE_DUMMY_PREFIX, name)
#define _OVERLOADABLE_FUNCTION(call, prefix, dummy_prefix, name) \
__OVERLOADABLE_FUNCTION(call, prefix, dummy_prefix, name)
#define __OVERLOADABLE_FUNCTION(call, prefix, dummy_prefix, name) \
RETURN_TYPE (*prefix##name)(ARGUMENTS) = NULL; \
int call##Overload##name(RETURN_TYPE (*func)(ARGUMENTS)); \
int call##Overload##name(RETURN_TYPE (*func)(ARGUMENTS)) \
{ \
int return_code; \
static int overloaded = 0; \
if (func) \
{ \
if(overloaded < 2) \
{ \
prefix##name = func; \
overloaded++; \
return_code = overloaded; \
} \
else \
{ \
return_code = 0; \
} \
} \
else \
{ \
return_code = overloaded; \
} \
\
return return_code; \
}
#define OVERLOADABLE(name) OVERLOADABLE_FUNCTION(name)
OVERLOADABLE(Evolve)
int PUGH_Evolve(void)
{
/* test code */
printf("%s:%d\n", __func__, __LINE__);
return 0;
}
void test(void)
{
CCTK_OverloadEvolve(PUGH_Evolve);
CCTK_Evolve();
}
int main(void)
{
test();
return 0;
}
运行结果:
$ ./main
PUGH_Evolve:50