C89计算goto(再次)如何

时间:2017-05-07 13:56:23

标签: c goto

我需要对自动机进行编码,并且我遇到了计算goto的旧需求(ala fortran4 :))

我需要在便携式ansi-C中对此进行编码。

我希望远离那些"不要远离longjmp / setjmp,远离嵌入式ASM(),远离非ansi-C扩展。

有谁知道怎么做?

1 个答案:

答案 0 :(得分:2)

就像我在评论中所说,尽管你请求不使用goto以外的任何东西,但标准C没有提供任何东西。

适当地设计你的状态,并将指向它的指针传递给处理函数以供它们修改。这样处理程序可以设置下一个要调用的函数。像这样:

struct state;
typedef void state_func(struct state*);
#define NULL_ACTION_ADDRESS (state_func*)0

struct state {
    state_func    *action;
    int            value1;
    int            value2;
};

#define INIT_STATE { initial_action, -1, -1}

state_func initial_action;
state_func handle_a;
state_func handle_b;

int main(void) {
    struct state s = INIT_STATE;

    while(s.action != NULL_ACTION_ADDRESS) {
        (*s.action)(&s);
    }

    return 0;
}

void initial_action(struct state* ps) {
    ps->action = &handle_a;
}

void handle_a(struct state* ps) {
    ps->action = &handle_b;
}

void handle_b(struct state* ps) {
    ps->action = NULL_ACTION_ADDRESS;
}