在C89中是否有可能通过一个运算符作为函数参数?我的意思是通过expample <
,==
,>=
等。像Java中的自定义比较器,但只通过特定符号传递。也许有特殊类型的预处理器宏的解决方案(我尝试使用从处理器宏中取出的'#')?比较器作为函数参数
我知道指向函数的指针,但我想要一些不同的东西。
例子:
void fun(int a, int b, comperator)
{
if(a comperator b)
........
}
在C89中是否有可能通过一个运算符作为函数参数?我的意思是通过expample <
,==
,>=
等。像Java中的自定义比较器,但只通过特定符号传递。也许有特殊类型的预处理器宏的解决方案(我尝试使用从处理器宏中取出的'#')?比较器作为函数参数
我知道指向函数的指针,但我想要一些不同的东西。
例子:
void fun(int a, int b, comperator)
{
if(a comperator b)
........
}
您可以使用宏。但请记住 - 宏不是一个函数;它有不同的(丑陋的)语法,一些具体的问题,一些优势等
假设你有一个函数:
int fun(int x, int y)
{
if (x < y)
return 1;
else if (x < 2 * y)
return 2;
else if (x < 2 * y)
return 3;
else
return 4;
}
要使用不同的比较,首先将它转换成一个宏:
#define FUN(x, y) \
x < y ? 1 : \
x < 2 * y ? 2 : \
x < 3 * y ? 3 : \
4
这种转换是非常难看(它通常比在我的例子更丑会),而且并不总是可能的,但现在你可以添加一个比较:
#define FUN(x, y, c) \
x c y ? 1 : \
x c 2 * y ? 2 : \
x c 3 * y ? 3 : \
4
用法:
printf("%d\n", FUN(3, 5, <));
(注:在宏,你应该围绕变量加括号,例如解释here;为了清楚,我省略了它们)。
不,你不能,只是通过它像一个字符串,并进行测试的功能
最简单的方法是使用代表比较器的枚举,但有一些操作可以编写一个调用funLT(),funGT ...的fun()或者枚举比较器为LT,GT的宏包装。 。用于开关盒。
如果fun(...)
是相当大的,你可能想在函数内的适当位置使用enums和switch case。
enum{LT,GT,EQ,NE,LE,GE};
#define fun(a,b,OP) fun_(a,b,
(0 OP 1) \
? (1 OP 0) \
? NE \
: (0 OP 0) \
? LE \
: LT \
: (0 OP 0) \
? (1 OP 0) \
? GE \
: EQ \
: GT \
)
fun(int a, int b, int op){
//code
switch(op){
case GE: //etc...
}
//more code
}
如果函数是小,你可能反而喜欢有独立的功能为每个操作员
#define fun(a,b,OP) \
(0 OP 1) \
? (1 OP 0) \
? funNE((a),(b)) \
: (0 OP 0) \
? funLE((a),(b)) \
: funLT((a),(b)) \
: (0 OP 0) \
? (1 OP 0) \
? funGE((a),(b)) \
: funEQ((a),(b)) \
: funGT((a),(b))
如果函数指针不是一个解决方案,你的运气了;没有办法将比较运算符传递给函数。您可以使用比较运算符作为函数式宏的参数,但这是一个宏而不是函数。你可以用一个枚举对比较器进行编码:enum比较{EQ,NE,LT,LE,GT,GE};'并将其作为参数传递给函数。 –
@anatolyg我想要这样的东西:。但是,我想,在所有的答复中,这在c中是不可能的。感谢球员的快速反应:) – Michocio
为什么你想要的东西不同于函数指针? – erip