【问题标题】:C ADT function pointer as parameter?C ADT函数指针作为参数?
【发布时间】:2015-12-10 22:57:46
【问题描述】:

我在 ADT 中有一个函数:

Pgroup new_group(int size, void (*foo)(void *));

在我的其他课程中,我有这个功能可以发送:

void foo(Pstruc x);

x 是一个指向结构的指针。但是,当我尝试调用 new_group 时,我收到一个错误“预期为 'void (*)(void )' 但参数的类型为 'void ()(struct struc_ *)”。这就是我一直以来的称呼:

Pgroup group = new_group(num, &foo);

有什么建议吗?

【问题讨论】:

  • 你到底想知道什么?
  • 我应该调用什么函数才能正确编译?

标签: c function-pointers abstract-data-type


【解决方案1】:

您可以将参数转换为正确的类型以摆脱诊断:

Pgroup group = new_group(num, (void (*)(void *)) foo);

请注意,这是不可移植的,因为 C 不保证不同指针之间的表示是相同的。最好使用与其声明匹配的类型。

【讨论】:

    【解决方案2】:

    您可以将原始函数从void foo(Pstruc x); 重写为void foo(void* x);

    或转换其类型:(void(*)(void*))foo

    【讨论】:

    • (void(*)(void*))foo 是个坏主意 - 它现在可以工作,但它可能会在遥远的将来某个时候回来咬你,你不知道问题出在哪里.
    • (虽然,就函数指针转换而言,与人们尝试使用不同的调用约定或不同大小的参数转换函数指针相比​​,这种方法相对温和)
    • 因此,对于那些棘手的情况,最好在模块之间使用无类型的标头函数声明。
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多