正确的方法来定义函数的指针

roo*_*kie 3 c

大家好,我有这段代码:

void foo(int var, int var1)
{
 printf("%d\n", var);
 printf("%d\n", var1);
}

void foo_for_foo( void (*some_function)(int, int))
{
 int x = 5;
 some_function(x, x);
}

int main()
{
 void (*ptr_foo);  // <- look here
 ptr_foo = &foo;
 foo_for_foo(ptr_foo);

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何定义函数指针是否重要:

1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);
Run Code Online (Sandbox Code Playgroud)

我的编译器收到两个版本

提前感谢解释差异

Tyl*_*nry 6

这两种形式并不相同.

void (*ptr_foo)根本不是函数指针.这是一个普通的非函数void指针.括号是多余的和误导性的.这就像你写的那样void* ptr_foo.

void (*ptr_foo)(int, int)是一个声明函数指针的正确方法,该函数指针指向一个带两个ints并返回的函数void.

这种方法的唯一原因是因为在C中,void指针可以隐式转换为任何其他类型的指针.也就是说,您可以将任何其他指针指定给a void*,并且可以将a指定void*给任何其他指针.

但是这个在这个例子中起作用的事实本质上是语法的意外.你不能在一般的更换void (*foo)(int, int)void (*foo).

如果您尝试some_function在参数列表中执行此操作foo_for_foo,您的编译器将在您尝试调用时抱怨,some_function因为它不是函数指针.

同样,如果您的foo函数碰巧返回int而不是void,您会立即注意到问题.声明ptr_foo作为int (*ptr_foo)将导致在语句中的错误ptr_foo = &foo,因为不像void指针,int指针不是隐式转换为其他指针类型.

简而言之,始终使用第二种形式.尽管存在这种不稳定的情况,但它是唯一一个正确的.