2

这可能是一个新手问题,我之前看到过类似的问题,但我希望有人能帮助我。下面是一个小的(希望是)说明性代码。我想让两个函数共享一些代码。他们都会有一个测试,归结为:if(int operator int)。应该可以用指针来描述操作符,然后在测试中使用指针指向的东西,不应该吗?

func1(){
  func3(1)
}

func2(){
  func3(2);
}

func3(int type){
  char *op;
  int value1;
  int value2;
  switch (type){
  case 1:
        op = ">";
        value1 = 1;
        value2 = 3;
        break;
  case 2: 
       op = "=";
       value1 = 2;
       value2 = 5;
       break; 
 }
 if (value1 *op value2){
     do something
 }
}

我发现 > 在文本到二进制计算器中被转换为 62(十进制),但这打印出 60 - 为什么?

char *p = "<";
printf("%d\n", *p);
4

4 回答 4

1

您实际上想要使用函数指针......您不能简单地使用 achar成为一个函数,因为 char 值等同于运算符的标记。像您尝试的令牌替换只能使用预处理器完成。

于 2013-03-10T19:47:45.393 回答
1

你不能完全按照你写的那样去做。但它应该可以使用函数指针。这是您可能能够做到的一种方法:

func1(){
  func3(1)
}

func2(){
  func3(2);
}
typedef (int *myOperator)(int, int);
int operatorGt(int a, int b) {
  return a > b;
}

int operatorEq(int a, int b) {
  return a = b;
}


func3(int type){
  myOperator op = NULL;
  int value1;
  int value2;
  switch (type){
  case 1:
        op = &operatorGt;
        value1 = 1;
        value2 = 3;
        break;
  case 2: 
       op = &operatorEq;
       value1 = 2;
       value2 = 5;
       break; 
 }
 if (NULL != op && op(value1, value2)){
     do something
 }
}

我不保证这将编译或工作 - 但该方法更有可能工作。我还没有编译它——所以可能会有一些编译器错误和/或警告需要为你修复。不想让它太容易:D

于 2013-03-10T19:52:00.190 回答
1

应该可以用指针来描述操作符,然后在测试中使用指针指向的东西,不应该吗?

不用担心,不可能使用指针引用/取消引用运算符,因为运算符与数据类型完全不同。

于 2013-03-10T19:52:22.713 回答
1

正如其他人所说,您不能直接获取 C 运算符的地址,但可以获取仅用于使用运算符的函数的地址。由于操作符的数量是有限的,你可以——排序——将一个操作符转换为一个指针,如下所示:

#define DECLARE_OPFN(name, operator) bool op_##name(int op1, int op2) { \
  return op1 operator op2; \
}

DECLARE_OPFN(lt, <)
DECLARE_OPFN(le, <=)
DECLARE_OPFN(gt, >)
DECLARE_OPFN(ge, >=)
DECLARE_OPFN(eq, ==)
DECLARE_OPFN(ne, !=)

typedef bool (*opfn_type)(int, int);

opfn_type get_opfn(char *op)
{
  static const struct {
    const char *str;
    bool (*op)(int, int);
  } all_ops[]  = { {"<", op_lt}, {"<=", op_le}, {">", op_gt}, {">=", op_ge},
                   {"==", op_eq}, {"!=", op_ne} };
  int i;
  for (i = 0; all_ops[i].str; i++)
    if (!strcmp(op, all_ops[i].str))
      return all_ops[i].op;
  return NULL;
}

// ...
get_opfn(my_op_str)(val1, val2);
于 2013-03-10T21:01:47.037 回答