gpt4 book ai didi

c - 显式声明函数指针而不是数据指针

转载 作者:太空狗 更新时间:2023-10-29 14:57:12 24 4
gpt4 key购买 nike

我正在使用 Microsoft Visual Studio 将程序从 C++ 转换为 C。这是一个 Windows 应用程序,但我认为这与这个问题无关。

我正在使用 /W4 开关来打开更多警告消息。我希望我的程序在没有警告的情况下编译。该程序编译并运行良好。这只是警告消息。

在程序是 C++ 之前,它编译时没有警告,但现在我已经尽我所能将它转换为 C,出现了一个我不知道如何处理的警告。

这是相关代码。我的想法是我正在为 GUI 创建一个菜单系统。每个菜单都包含菜单项的集合,每个菜单项都包含一个函数指针,表示当用户选择该菜单项时将执行的操作。

typedef struct MENUITEM
{
wchar_t* Name;
void* Action;
} MENUITEM;

typedef struct MENU
{
wchar_t* Name;
uint8_t SelectedItem;
uint8_t ItemCount;
MENUITEM** Items;
} MENU;

在程序的其他地方,这是在用户选择菜单项时处理事件的代码:

void(*FP) (void) = NULL;
FP = (void(*)())MyMenu.Items[MyMenu.SelectedItem]->Action;
FP();

以下是生成的编译器警告:

C4152 nonstandard extension, function/data pointer conversion in expression

C4113 'void (__cdecl *)()' differs in parameter lists from 'void (__cdecl *)(void)'

MSDN documentation对于警告消息 C4152 状态:

A function pointer is converted to or from a data pointer. This conversion is allowed under Microsoft extensions (/Ze) but not under ANSI C.

好的,所以我认为这解释了为什么它没有像 C++ 那样产生警告,但是当作为 C 编译时,它会产生警告。但我不知道如何处理它。老实说,我之前并没有意识到函数指针和数据指针之间存在区别。

我不知道如何更改函数指针的声明,以便编译器明确知道这是一个函数指针,而不是数据指针。

最佳答案

你可能需要这个(使用 typedef):

typedef void(*FP) (void);

typedef struct MENUITEM
{
wchar_t* Name;
FP Action;
} MENUITEM;

int main() {

MENUITEM it;
// ... more code

FP fp = it.Action;
fp();

return 0;
}

关于c - 显式声明函数指针而不是数据指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com