有没有办法在 C switch 语句中使用指针?

Is there some way to use pointers inside C switch statements?

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

struct myObject {
    int tag;
    ...
}

所以很容易使用基于标签字段的switch语句来执行不同的动作。 例如:

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

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

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

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

首先拥有 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;
}

假设 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_INTEGERdo_something_str 用于 OBJ_STRING,等等。现在您可以将 switch 替换为

((struct dyn_type*)obj->isa)->process(obj)