2015-12-05 41 views
1

在C89中是否有可能通过一个运算符作为函数参数?我的意思是通过expample <==,>=等。像Java中的自定义比较器,但只通过特定符号传递。也许有特殊类型的预处理器宏的解决方案(我尝试使用从处理器宏中取出的'#')?比较器作为函数参数

我知道指向函数的指针,但我想要一些不同的东西。


例子:

void fun(int a, int b, comperator) 
{ 
    if(a comperator b) 
     ........ 
} 
+1

如果函数指针不是一个解决方案,你的运气了;没有办法将比较运算符传递给函数。您可以使用比较运算符作为函数式宏的参数,但这是一个宏而不是函数。你可以用一个枚举对比较器进行编码:enum比较{EQ,NE,LT,LE,GT,GE};'并将其作为参数传递给函数。 –

+0

@anatolyg我想要这样的东西: void fun(int a,int b,comperator){if(a comperator b)........}。但是,我想,在所有的答复中,这在c中是不可能的。感谢球员的快速反应:) – Michocio

+0

为什么你想要的东西不同于函数指针? – erip

回答

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;为了清楚,我省略了它们)。

0

不,你不能,只是通过它像一个字符串,并进行测试的功能

0

最简单的方法是使用代表比较器的枚举,但有一些操作可以编写一个调用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))