C通过函数指针回调并没有它。为什么没有区别?

时间:2015-04-22 08:08:02

标签: c pointers callback language-lawyer

我无法理解为什么不同的代码会起作用,因为它们是相同的。

#include <stdio.h>

void foo() {
    printf("Hello\n");
}

void foo1(void fn()) {
    (*fn)();
    fn();
}

void foo2(void (*fn)()) {
    (*fn)();
    fn();
}

int main(void) {
    foo1(foo);
    foo2(foo);
    return 0;
}

如果它们相同,那么为什么这不起作用?

typedef void F1(), (*F2)();

int main(void) {
    F1 f1;
    F2 f2;
    // error: lvalue required as left operand of assignment
    f1 = foo1;
    f2 = foo2;
    return 0;
}

P.S。

我的兴趣不在于typedef(第二个例子) 我只对第一个例子有疑问 那就是:

  • 功能声明
  • 功能调用

1 个答案:

答案 0 :(得分:1)

您正在错误地使用typedef。第一个F1()根本不是函数指针。您的第二部分正确地为函数指针(*F2)()提供了typedef,但是您没有包含类型。底线,但你不能在一行中获得2个函数指针typedef:

typedef void (*F1)();
typedef void (*F2)();

将同时创建F1的typedef和F2的typedef。

对于函数指针的 use ,函数指针可以与parens和dereference一起使用,也可以不使用。

(*fn)();
fn();

两者都是等价的,只需调用fn指向的函数即可。