C 实现FSM真的需要函数指针吗?

C 实现FSM真的需要函数指针吗?,c,data-structures,function-pointers,C,Data Structures,Function Pointers,我在后面的文章中读到了他们用C语言提供小型FSM的实现 我不太明白他们为什么选择函数指针。在我的理解中,当一个人需要相同的接口时,指向函数的指针是有用的,但是对于不同类型的“事件”,例如解析一些Internet协议包(注册一个指向函数的指针并为其分配不同的函数很方便,一个用于解析HTTP,第二个用于解析FTP等等。这只是一个示例,但我想你明白我的意思了) 但是太长了,读不下去了,我想承认,这篇文章有点太差了,但是我会说我在C中创建的最简单最优雅的方法之一是从 这是一个剪贴画 #define FS

我在后面的文章中读到了他们用C语言提供小型FSM的实现

我不太明白他们为什么选择函数指针。在我的理解中,当一个人需要相同的接口时,指向函数的指针是有用的,但是对于不同类型的“事件”,例如解析一些Internet协议包(注册一个指向函数的指针并为其分配不同的函数很方便,一个用于解析HTTP,第二个用于解析FTP等等。这只是一个示例,但我想你明白我的意思了)


<>但是太长了,读不下去了,我想承认,这篇文章有点太差了,但是我会说我在C中创建的最简单最优雅的方法之一是从

这是一个剪贴画

#define FSM
#define STATE(x)      s_##x :
#define NEXTSTATE(x)  goto s_##x

FSM {
  STATE(x) {
    ...
    NEXTSTATE(y);
  }

  STATE(y) {
    ...
    if (x == 0) 
      NEXTSTATE(y);
    else 
      NEXTSTATE(x);
  }
}
有些人可能会对在任何情况下使用goto犹豫不决,但我认为这是一个真正漂亮地使用它的实现


因此,为了回答您的问题,是的,我不仅认为函数指针对FSM来说可能过于致命,而且它还会使代码变得模糊。

实现FSM最直接的方法是通过函数指针。
在FSM中,定义了将事件和状态与特定行为关联的映射。
因此,根据不同的状态,同一事件应以不同的方式处理。函数指针的使用最适合这种情况。
此外,它易于扩展。要添加新行为,只需添加新函数并更新新行为的映射表。
它还可以扩展为具有多个状态机。

我想可能还有其他“黑客”来实现FSM,但函数指针是标准化的方法。

首先,看看这个,在我看来,这比你发布的更容易理解

第二,你是对的:函数指针对于为同一个“事件模式”实现不同的行为很有用。这就是OOP中通常所说的多态性(看看)

所以,如果你仔细想想……这正是FSM所需要的:以不同的方式对同一事件做出反应,也就是说:为FSM中的每个状态转换实现不同的功能

乍一看,您可以说一个“经典”的switch语句就足以实现这一点,但是扩展函数指针实现的灵活性和机会将从长远来看对您有所回报