将函数的地址输入到C中的结构中

时间:2014-04-05 18:27:34

标签: c function pointers

typedef void (*MenuItemFunctionPtr) () ; 

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

void MenuItemAFunction ();

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

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};

但是我总是得到关于函数指针的错误,它们根据我想要定义它的方式而不同所以我想必须有其他方式,但我不知道如何正确地执行它。

如何填充MenuItem结构?

1 个答案:

答案 0 :(得分:0)

旧式函数声明在C中已弃用。也就是说:

void MenuItemAFunction();

表示,在{C}中,MenuItemAFunction一个函数不返回任何内容,但它接受未知数量的参数或未知类型:声明几乎没有说明参数列表。

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

void MenuItemAFunction(void);
  

旁注:在C ++中,这是不同的。 ()语法很好地声明了一个没有参数的函数。 Bjarne Stroustrup在他与Classes" C一起工作时听取了顾问的意见。那就变成了C ++。丹尼斯·里奇称(void)是一个憎恶的人。所以Stroustrup确信()具有明显的意义。

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

struct MenuItem MenuItemA = {textA, MenuItemAFunction, &MenuItemB, 0};
struct MenuItem MenuItemA = {textA, &MenuItemAFunction, &MenuItemB, 0};

&运算符的地址不是必需的,因为表示函数的表达式(例如由作为函数名称的标识符组成的主函数)已经评估为没有地址的指针 - 运营商。

如果意图是采用该函数的地址,你不想表达函数调用:MenuItemAFunction()周围不能放置语法组合来指向函数从那个表达出来。

您剩余的"未定义的参考"错误源于你只有声明函数MenuItemAFunction,而不是定义它。你不能获取一个函数的地址存在。也许您的项目(Makefile,IDE,...)设置不正确,而不是在包含该函数定义的源文件中进行编译和链接。