指针指向函数指针错误之间的转换

时间:2012-06-22 17:20:52

标签: c casting typedef gcc-warning

所以我试图解决这个警告:nonstandard conversion between pointer to function and pointer to data我无法找到一个很好的方法来做到这一点。这都是用c而不是c ++完成的。

目前我有一个头文件:

typdef struct myConnection_s
{
    ...
    void*   Callback
} myConnection_t, *Connection


typdef HRESULT (*HttpHook)(Connection, char*);

在foo.c的其他文件中我有:

....
Connection myConnection;
...

HttpHook myHook = (HttpHook) myConnection->Callback;
...
return myHook(.....);

有没有一种很好的方法来修复此警告而无需改变太多?如果不是,那么重写这个的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

typedef struct myConnection_s
{
    /* ... */
    HttpHook Callback;
} myConnection_t, *Connection;

您也可以稍后删除显式转换:

HttpHook myHook = myConnection->Callback;

if (myHook)
    myHook(/* ... */);

修改:看起来您有订购问题...试试这个:

struct myConnection_s;

typedef HRESULT (*HttpHook)(struct myConnection_s *, char*);

typedef struct myConnection_s
{
    /* ... */
    HttpHook Callback;
} myConnection_t, *Connection;

答案 1 :(得分:0)

请参阅this answer一个类似的问题。 C标准不允许将数据指针转换为函数指针,反之亦然。您可以在某些平台上执行此操作,但它不是可移植代码。

Sean Bright的答案是处理这个问题的正确方法。你也可以使用泛型函数指针(没有参数的void返回)和转换为/从该类型,但在我看来这是危险的。如果使用特定的函数指针类型,编译器将在您尝试使用具有不同签名的函数时发出警告。