C89中是否有可能将操作符作为函数参数传递?我的意思是传递示例<
,==
,>=
等等。像Java中的自定义比较器,但只传递特定符号。也许有特殊类型的预处理器宏的解决方案(我尝试使用#&#39;#&#39;取自处理器宏)?
我知道有关函数的指针,但我想要一些不同的东西。
示例:
void fun(int a, int b, comperator)
{
if(a comperator b)
........
}
答案 0 :(得分:1)
您可以使用宏。但请记住 - 宏不是一个功能;它有不同的(丑陋的)语法,一些特定的问题,一些优点等等。
假设你有一个功能:
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;为清楚起见,我省略了它们。)
答案 1 :(得分:0)
不,你不能,只是像字符串一样传递它并在函数中进行测试
答案 2 :(得分:0)
最简单的方法是使用代表比较器的枚举,但通过一些操作,你可以编写一个宏包装器来fun()调用funLT(),funGT ......或者将比较器枚举到LT,GT,..用于开关盒。
如果fun(...)
相当大,您可能希望在适当的位置使用函数内部的枚举和开关案例。
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))