【发布时间】:2018-04-09 06:27:48
【问题描述】:
我想定义很多函数调度器。基于一个标志,我会调用一个或另一个。标志检查总是一样的,命名也是一样的。
这是一个示例代码:
int myfunction(int a,int b)
{
if (flag)
return myfunction_flag1(a, b);
else
return myfunction_flag0(a, b);
}
由于此代码将针对我的每个函数重复(实际用例使用的行数比仅此 if else 多,但出于问题目的而对其进行了简化),因此我想将其编写为 MACRO。
#define DISPATCHER(function_type, function_name, ...) \
function_type function_name(__VA_ARGS__) \
{ \
if (flag) \
return function_name ## flag1(__VA_ARGS__); \
else \
return function_name ## flag0(__VA_ARGS__); \
} \
然后有很多:
DISPATCHER(int, myfunction, int a, int b)
DISPATCHER(int, myfunction2, int a, int b, int c)
DISPATCHER(int, myfunction3, int a)
...
但是,我不能调用 function_name ## flag1(\__VA_ARGS__),因为 \__VA_ARGS__ 包含参数类型。
有没有办法以另一种方式做到这一点?
【问题讨论】:
-
还有 2017 年...为什么不用 C++ 呢?
-
为什么要将它作为宏?为什么不使用内联函数? (相信你的编译器会优化不必要的函数调用)
-
标志可以在运行时改变。我想向我的用户公开一个干净的功能。然后在后端检查我的标志并调用适当的函数(与原始函数具有相同的签名)。
-
我相信,如果坚持使用宏,你将不得不遵循类似于here 描述的宏定义,并重做它以具有像
DISPATCHER(int, myfunction, int, a, int, b) DISPATCHER(int, myfunction2, int, a, int, b, int, c)这样的调用约定和像#define DISPATCHER(rettype, fnname, type1, var1, ...)这样的启动宏 -
@JacekCz 因为它是一种不同的语言,即使每个人都同意它更好(我当然同意,但其他人不同意),迁移并不总是像看起来那样微不足道。
标签: c preprocessor variadic-macros