c-如何在当前上下文中定义函数指针



嘿,如果给我以下defs,我有点困惑如何定义函数指针:

struct menu_item
{
    char name[ITEM_NAME_LEN+1];
    BOOLEAN (*func)(struct vm*);
};

我使用下面的函数menu_init定义了menu_item包含的初始变量。该函数用于定义菜单项数组中的每个成员。

void menu_init(struct menu_item * menu)
{
    strcpy(menu[0].name, "t1. Display Items");
    menu[0].func = (*void)&print_list(struct vm_node node); //print list is suppose to print the entire linked list past to the function print_list. Though i am unsure if this is correct. 
    strcpy(menu[1].name,"t2. Purchase Items");
    strcpy(menu[2].name,"t3. Save and Exit");
    strcpy(menu[3].name, "t4. Add Item");
    strcpy(menu[4].name,"t5. Remove Item");
    strcpy(menu[5].name,"t6. Display Coins");
    strcpy(menu[6].name, "t7. Reset Stock");
    strcpy(menu[7].name,"t8. Reset Coins");
    strcpy(menu[8].name,"t9. Abort Program");
  /* The UNUSED() function is designed to prevent warnings while your 
     * code is only partially complete. Delete this function call once 
     * you are using vm in your own code */
}

print_list的声明如下。

void print_list(struct vm_node  *root);

任何帮助都将不胜感激。

您的语法错误。

最简单的修复方法是通过更改函数以使其具有与函数指针匹配的正确类型来消除强制转换:

BOOLEAN print_list(struct vm_node *root);

然后你可以做:

menu[0].func = print_list;

请注意,这更有意义,因为通过func函数指针调用的代码将期望BOOLEAN返回值,因此强制它使用并通过强制转换调用不匹配的函数不是一个好主意。

如果您有一个struct menu_item变量

struct menu_item m ;
m.func = you_function_name ;

这就是语法,在您的情况下是:

void menu_init(struct menu_item * menu)
{
    strcpy(menu[0].name, "t1. Display Items");
    menu[0].func = print_list;
    ....

你把它称为任何其他函数:

menu[0].func( node) ;

这是创建和分配(在同一行中…)函数指针的示例

int g(int y){return y;}
int main()
{
    int (*f)(int x) = &g; // initializing f with the address of g. f is a pointer to a function that returns int, and has 1 int parameter
    printf("%d",f(1)); // calling g, using the pointer f
    return 0;
}

现在,函数指针可能会被滥用,所以f = g而不是f = &g也会起作用,而且还有几种方法可以达到同样的结果。

关于您的代码,如果print_list是一个布尔返回函数,您可以像我在上面的例子中所做的那样,分配menu[0].func = print_list;。相反,您将其定义为void返回函数。

相关内容

  • 没有找到相关文章

最新更新