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

Mar*_*rco 4 c compiler-construction interpreter vm-implementation

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

struct myObject {
    int tag;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

switch (obj->tag) {
    case OBJ_INTEGER: ...
    case OBJ_STRING: ...
    case OBJ_FUNC:...
}
Run Code Online (Sandbox Code Playgroud)

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

if (obj->isa == class_integer) {
    ...
} else if (obj->isa == class_string) {
    ...
} else if (obj->isa == class_func) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 14

首先拥有isa指针的美妙之处在于能够完全省去switch语句.

考虑一下开关:

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;
}
Run Code Online (Sandbox Code Playgroud)

让我们说isa指针指向struct你拥有的一些- 比方说struct dyn_type.添加一个函数指针struct,如下所示:

typedef void (*ProcessPtr)(dyn_obj * obj);

struct dyn_type {
    ... // fields of your current struct
    ProcessPtr process;
};
Run Code Online (Sandbox Code Playgroud)

process字段设置为do_something_intfor OBJ_INTEGER,do_something_strfor OBJ_STRING等.现在可以替换switch

((struct dyn_type*)obj->isa)->process(obj)
Run Code Online (Sandbox Code Playgroud)