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
结构?
答案 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,...)设置不正确,而不是在包含该函数定义的源文件中进行编译和链接。