0

我正在尝试学习 ncurses,并且正在阅读此处的精彩指南,但用户指针处的示例无法编译。尝试编译时出现此错误。

menu.cpp: In function 'int main()':

menu.cpp:44: error: invalid conversion from 'void (*)(char*)' to 'void*'

menu.cpp:44: error: initializing argument 2 of 'int set_item_userptr(ITEM*, void*)'

menu.cpp:70: error: invalid conversion from 'void*' to 'void (*)(char*)'

此外,您可能需要添加 cstdlib 和 cstring 才能使用 strlen 和 calloc 进行编译。

我对 void 指针了解不多,因此非常感谢您对修复示例的帮助。

谢谢

4

2 回答 2

2

您正在使用 C++ 编译器,因此您需要执行以下操作:

    set_item_userptr(my_items[i], (void *)func);

然后再次,

    p = (void*)item_userptr(cur);
于 2010-02-09T08:12:52.697 回答
2

通过阅读手册页:

#include <menu.h>
int set_item_userptr(ITEM *item, void *userptr);
void *item_userptr(const ITEM *item);

描述

每个菜单项都有一个字段,可用于保存特定于应用程序的数据(即,菜单驱动程序代码不理会它)。这些函数获取和设置该字段。

userptr是您应该提供给的用户特定数据set_item_userptr()。如果您不想提供任何数据,则应提供NULL. 看起来您正在set_item_userptr()使用指向函数的指针作为其第二个参数进行调用。不能保证您可以void *在 C 或 C++ 中可移植地来回转换函数指针(在将 a 转换void *为任何其他指针类型时,C++ 需要强制转换)。在不知道您要做什么的情况下,如果您确实需要传递函数指针,则应将其转换为适当的类型:

int ret = set_item_userptr(item, reinterpret_cast<void *>(ptr));
void (*pf)(char*);
pf = reinterpret_cast<void (*)(char *)>(item_userptr(item));

但它不能保证工作。你应该做一些别的事情,比如拥有一个struct包含函数指针的 a ,并将一个指针传递给structto set_item_userptr()

于 2010-02-09T08:34:21.407 回答