有没有办法在C语言切换语句中使用指针?

时间:2017-02-21 16:49:06

标签: c compiler-construction interpreter vm-implementation

通常在动态类型编程语言中,对象struct具有用于标识对象类型的标记字段。 例如:

struct myObject {
    int tag;
    ...
}

因此,使用基于标记字段的switch语句可以轻松执行不同的操作。 例如:

switch (obj->tag) {
    case OBJ_INTEGER: ...
    case OBJ_STRING: ...
    case OBJ_FUNC:...
}

在我的情况下,我使用了一个void * isa指针而不是int标记字段,该指针指向代表该对象的类。一切正常,我不得不使用优雅的switch语句而不是使用一系列if / else语句。例如:

if (obj->isa == class_integer) {
    ...
} else if (obj->isa == class_string) {
    ...
} else if (obj->isa == class_func) {
    ...
}

我知道我不能在C switch语句中使用指针,但我想知道我是否可以使用一些聪明的技巧来加速if语句系列。

1 个答案:

答案 0 :(得分:14)

首先使用switch (obj->tag) { case OBJ_INTEGER: do_something_int(obj); break; case OBJ_STRING: do_something_str(obj); break; case OBJ_FUNC: do_something_func(obj); break; } 指针的美妙之处在于能够完全省去switch语句。

考虑一个开关:

isa

让我们说struct指针指向您拥有的某些struct dyn_type - 比如struct。添加一个指向typedef void (*ProcessPtr)(dyn_obj * obj); struct dyn_type { ... // fields of your current struct ProcessPtr process; }; 的函数指针,如下所示:

process

do_something_int设置OBJ_INTEGER字段为do_something_str,为OBJ_STRING设置switch等等。现在,您可以将((struct dyn_type*)obj->isa)->process(obj) 替换为

[object Object]