【问题标题】:callback with void pointer argument produce warning带有 void 指针参数的回调产生警告
【发布时间】:2014-08-19 01:42:45
【问题描述】:

我有以下代码:

/* callback taking a pointer to a "generic" msg as argument */
typedef void (*Callback_t)(void *msg);

/* initialize callback pointer */
Callback_t const Callback[] =
{
  ProcessMsgAction0,  /**< 0: MSGID_ACTION_0 */
  ProcessMsgAction1,  /**< 1: MSGID_ACTION_1 */
  /* ... */
};

/* Call the callback according to msgid */
msg = GetMessage();
Callback[msg->id](msg);

/* implement callback for each message id */
void ProcessMsgAction0(action0_t *msg) { /* ... */ }
void ProcessMsgAction1(action1_t *msg) { /* ... */ }

我虽然 void* 被认为是通用指针。所以我给它的任何地址都不会产生警告,但在上面的情况下action0_t*void* 不同,所以它会产生以下警告:initialization from incompatible pointer type

如果我想抑制警告,我唯一的解决方案是将 ProcessMsgAction 参数更改为 void* 吗?

使用的编译选项:-ansi -pedantic -Wall -Wextra

【问题讨论】:

    标签: c compiler-warnings void-pointers


    【解决方案1】:
    I though void* was considered as generic pointer
    

    这是真的,但这个概念并没有扩展到匹配函数类型中的参数。

    不过,Callback_t 的简单类型转换可以工作,see this functional example on ideone.

    【讨论】:

    • 应该注意,这是未定义的(取决于 OP 对指针的实际操作,但看起来它最终将是未定义的)。 (还要注意,它适用于大多数机器,我真的想不出编译器可以利用这个 UB 等的方法。)也许用 C 风格的指针转换替换 reinterpret_cast(这是一个 C 问题,而不是 C++)。
    • A function pointer cast is a bug waiting to happen。不要这样做。最好将你的函数声明为void ProcessMsgAction0(void *msg) {} 并在内部从void* 转换为action0_t*
    • 我想避免它,但我别无选择,只能使用它。每条消息的结构大小不同,但使用方式相同。
    猜你喜欢
    • 2020-06-11
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2018-08-25
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多