在C语言中将函数的地址放入结构中

在C语言中将函数的地址放入结构中,c,function,pointers,C,Function,Pointers,我试图用几种方式定义我的结构: typedef void (*MenuItemFunctionPtr) () ; struct MenuItem{ char *TextToDisplayPtr; MenuItemFunctionPtr MenuItemFunctionPointer; struct MenuItem *NextMenuItem; struct MenuItem *SubMenuItem; }; void MenuItemAFunction (

我试图用几种方式定义我的结构:

typedef void (*MenuItemFunctionPtr) () ; 

struct MenuItem{
    char *TextToDisplayPtr;
    MenuItemFunctionPtr MenuItemFunctionPointer;
    struct MenuItem *NextMenuItem;
    struct MenuItem *SubMenuItem;
};

void MenuItemAFunction ();
但我总是在函数指针上出错,它们根据我想用什么方式定义它而有所不同,所以我想肯定还有其他方法,但我不知道如何正确地定义它


如何填充MenuItem结构?

C中不推荐使用旧式函数声明。也就是说:

struct MenuItem MenuItemA = {textA, MenuItemAFunction(), &MenuItemB, 0};
struct MenuItem MenuItemA = {textA, MenuItemAFunction, &MenuItemB, 0};
struct MenuItem MenuItemA = {textA, &MenuItemAFunction(), &MenuItemB, 0};
struct MenuItem MenuItemA = {textA, &MenuItemAFunction, &MenuItemB, 0};
在C语言中,意味着MenuItemAFunction是一个不返回任何内容,但接受未知数量的参数或未知类型的函数:声明中几乎没有提到参数列表

声明不带参数的函数的正确方法是:

void MenuItemAFunction();
边注:在C++中,这是不同的。语法很好地声明了一个没有参数的函数。当Bjarne Stroustrup在C语言上使用C++的课程时,他听取了顾问的意见。丹尼斯·里奇(Dennis Ritchie)称虚无为可憎之物。因此,斯特劳斯特鲁普被说服,使其具有明显的意义

因此,您可能会得到与此过时用法相关的诊断。解决这个问题;再试一次。这两种变体应该有效:

void MenuItemAFunction(void);
运算符的地址不是必需的,因为表示函数(如主函数)的表达式(由作为函数名的标识符组成)已计算为不带运算符地址的指针

如果您的目的是获取函数的地址,那么就不想表达函数调用:不能在MenuItemAFunction周围放置任何语法组合,以使指向该函数的指针从该表达式中产生


剩余的未定义引用错误源于您只声明了函数MenuItemAFunction,而没有定义它。不能获取不存在的函数的地址。也许您的项目生成文件、IDE。。。设置不正确,未在包含该函数定义的源文件中编译和链接

最后一个错误是什么?这似乎是最正确的。总的来说,包括你的错误信息会让人们更容易帮助你。就像fmoo一样,我认为最后一条是你所需要的。但您可能不需要运算符的最后地址:struct MenuItem MenuItemA={textA,&MenuItemAFunction,MenuItemB,0};。编译器错误将告诉我们。检查函数指针声明的最简单方法是尝试:MenuItemFunctionPtr pfn=&MenuItemFunction;。如果没有问题,那么问题出在另一个结构成员或其他地方;可以。但是当我尝试struct MenuItem MenuItemA={textA,&MenuItemAFunction,MenuItemB,0};我得到这个错误:1。对“MenuItemAFunction”2的未定义引用。ld返回1个退出状态。第二次分配与询问者的期望不符。然后他会存储一个指向函数的指针,而不是他在结构中键入和使用的指向函数的指针。@drahnr恐怕你需要阅读一些基本的C教程。表达式&malloc和malloc(例如)在计算时是等效的。它们都会产生一个指向函数的指针。Kaz我尝试了你告诉我的内容,但仍然得到了与我在上面的注释中所写的相同的两个错误。@user3023499已更新。您未定义的引用源于没有定义函数,只是声明了它。OMG您是对的;我想我不需要定义它,只需要重新定义它来调用这个函数。你知道的,就像变量一样。
struct MenuItem MenuItemA = {textA, MenuItemAFunction, &MenuItemB, 0};
struct MenuItem MenuItemA = {textA, &MenuItemAFunction, &MenuItemB, 0};