【发布时间】:2015-01-05 19:35:04
【问题描述】:
我有一个简短的程序来测试“无限递归”。但是,我遇到了另一个与函数指针相关的棘手问题......
程序如下:
#include <stdio.h>
int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}
char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}
int main(int argc, char const *argv[])
{
repeat(&f, 1);
return 0;
}
就我而言,我认为“repeat(&f, 1)”中的'f'具有“char *”的类型和'func' “int repeat(char (*func)(int, int), int a)”的类型也是“char *”。
然而,这似乎很奇怪。如果我将“(char (*func)(int, int), int a)”更改为 “(char func(int, int), int a) ”,编译器(在gcc和vc6中测试)没有任何警告,运行结果是一样的。
如果我将“(char (*func)(int, int), int a) ”更改为“(double func(int, int), int a) ”, 编译器抛出:
警告:不兼容的指针类型将 'char ()(int, int)' 传递给 'double ()(int, int)' 类型的参数 [-Wincompatible-pointer-types ] 重复(&f, 1);
似乎编译器将“double (int, int)”和“double (*)(int, int)”视为相同的东西。换句话说,如果我将“(char (*func)(int, int), int a)”更改为“double (*func)(int, int) ”,编译器会抛出同样的信息(我已经测试过了):
警告:不兼容的指针类型将 'char ()(int, int)' 传递给 'double ()(int, int)' 类型的参数 [-Wincompatible-pointer-types ] 重复(&f, 1);
上帝... 好吧,这不是结束。 之后,我将“repeat(&f, 1)” 改为“repeat(f, 1)”,其他部分不变。 也就是说,整个程序是:
#include <stdio.h>
int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}
char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}
int main(int argc, char const *argv[])
{
repeat(f, 1);
return 0;
}
编译器不给出任何警告,运行结果是一样的。
所以我很困惑,以下所有巴黎都没有产生警告和正确的结果。
1 repeat(&f, 1) int repeat(char (*func)(int, int), int a)
2 repeat(&f, 1) int repeat(char func(int, int), int a)
3 repeat(f, 1) int repeat(char (*func)(int, int), int a)
4 repeat(f, 1) int repeat(char func(int, int), int a)
当然,“repeat(f, 1)”中的“f”的类型是“char (int, int)”,而“func”在“int repeat(double (func)(int, int), int a)”中的类型为“char ()(int, int)”。
您可以通过将“int repeat(char (*func)(int, int), int a)”更改为“int repeat(double (*func)(int , int), int a)”并查看警告信息:
警告:不兼容的指针类型将 'char (int, int)' 传递给 'double ()(int, int)' 类型的参数 [-Wincompatible-pointer-types] repeat(f, 1);*
谁能给一些cmets?我完全认为关于类型,只有四个中的第一个是正确的。
【问题讨论】:
-
这段代码中没有任何
char *。char (*)(int, int)是一个指向函数的指针,它返回一个char并接受两个int参数。另外,cdecl.org. -
请注意,C 的类型系统不能声明一个接受自己作为函数参数的非可变函数。
标签: c pointers function-pointers