c - 定义函数指针的正确方法

标签 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;
}

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

1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);

我的编译器收到两个版本

预先感谢您对差异的解释

最佳答案

这两种形式并不等同。

void (*ptr_foo) 根本不是函数指针。这是一个普通的非函数空指针。括号是多余的和误导的。就像您编写了 void* ptr_foo 一样。

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

唯一可行的原因是因为在 C 中,void 指针可以隐式转换为任何其他类型的指针。也就是说,您可以将任何其他指针分配给 void*,也可以将 void* 分配给任何其他指针。

但是在这个例子中它起作用的事实本质上是语法上的意外。您通常不能将 void (*foo)(int, int) 替换为 void (*foo)

如果您尝试使用 foo_for_foo 的参数列表中的 some_function 执行此操作,当您尝试调用 some_function 时编译器会报错,因为它不是函数指针。

同样,如果您的 foo 函数恰好返回 int 而不是 void,您会立即注意到问题。将 ptr_foo 声明为 int (*ptr_foo) 会导致语句 ptr_foo = &foo 出错,因为与 void 不同> 指针,int 指针不能隐式转换为其他指针类型。

简而言之,始终使用第二种形式。尽管有这种侥幸的情况,但它是唯一在一般情况下是正确的。

关于c - 定义函数指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817395/

相关文章:

c - 如何处理线程退出的障碍

C 中的字符数组?

c - 配置文件 C 执行

c++ - 将 C/C++ dll 头文件转换为 Delphi 的最佳资源?

c - putchar() 和 getchar() 循环说明

c++ - 如何使用模板正确定义函数

c - 分配给缓冲区时 fgets 泄漏

c - 按位除以 2 的倍数

c++ - C/C++ 将字符串放入二维数组?

c - 无需轮询即可读取多条 UDP 消息