如何解决 C 和函数指针中的循环依赖问题

How to solve a problem with circular dependancy in C and function pointers

|在一个程序中,我将这个结构与函数指针一起使用,但我想更改它,以便我可以用一个语句保存、恢复和替换函数指针。

typedef struct MenuStr
{
       // more elements
       uint8_t (*ButtonUpPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonDownPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonLeftPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonRightPtr)(struct MenuStr *Menu);
       uint8_t (*PreMenuCursorPtr)(struct MenuStr *Menu);
       uint8_t (*MenuCursorPtr)(struct MenuStr *Menu);
       uint8_t (*PostMenuCursorPtr)(struct MenuStr *Menu);
       // more elements
}MENU;

因此我想将上面的更改为允许使用一条语句复制所有指针。

typedef struct Cursorstr
{
       uint8_t (*ButtonUpPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonDownPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonLeftPtr)(struct MenuStr *Menu);
       uint8_t (*ButtonRightPtr)(struct MenuStr *Menu);
       uint8_t (*PreMenuCursorPtr)(struct MenuStr *Menu);
       uint8_t (*MenuCursorPtr)(struct MenuStr *Menu);
       uint8_t (*PostMenuCursorPtr)(struct MenuStr *Menu);
}CURSOR_STR;

typedef struct MenuStr
{
           // more elements
           CURSOR_STR  Elements;
           // more elements
}MENU;

现在我遇到了指针参数的问题,我找不到解决方案。 感谢协助

您必须转发声明 MENU 结构。在 CURSOR_STR 的声明之前添加:

typedef struct MenuStr MenuStr;

所有这一切只是告诉编译器程序中将有一个名为MenuStr的结构,但稍后将定义它。


还可以考虑对函数指针使用 typedef。完整示例:

typedef struct MenuStr MenuStr;

typedef uint8_t ButtonFunc (MenuStr*);

typedef struct Cursorstr
{
  ButtonFunc* ButtonUpPtr;
  ButtonFunc* ButtonDownPtr;
  ButtonFunc* ButtonLeftPtr;
  ButtonFunc* ButtonRightPtr;
  ButtonFunc* PreMenuCursorPtr;
  ButtonFunc* MenuCursorPtr;
  ButtonFunc* PostMenuCursorPtr;
}CURSOR_STR;

typedef struct MenuStr
{
  // more elements
  CURSOR_STR  Elements;
  // more elements
}MENU;