如何解决 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;
|在一个程序中,我将这个结构与函数指针一起使用,但我想更改它,以便我可以用一个语句保存、恢复和替换函数指针。
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;