这可能是一个新手问题,我之前看到类似的问题,但我希望有人会帮助我。下面是一个小的(希望)说明性代码。我希望有两个函数共享一些代码。他们都会有一个测试,归结为: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);
答案 0 :(得分:1)
您实际上想要使用函数指针...您不能简单地使用char
成为函数,因为char值等同于运算符的标记。像你正在尝试的令牌替换只能通过预处理器完成。
答案 1 :(得分: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
答案 2 :(得分:1)
应该可以用指针来描述运算符 然后使用指针在测试中指向的内容,不应该吗?
不用担心,使用指针引用/取消引用运算符是不可能的,因为运算符与数据类型完全不同。
答案 3 :(得分: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);