接收和返回函数指针的函数指针类型?
Posted
技术标签:
【中文标题】接收和返回函数指针的函数指针类型?【英文标题】:Type of function pointer that receives and returns function pointer? 【发布时间】:2020-06-24 10:25:22 【问题描述】:指向int f(int i) return i;
的指针类型是int (*)(int)
- 这很好。另外,如果我设置using f_ptr = int (*)(int)
,即f_ptr
是指向f()
的指针类型,指向f_ptr g(f_ptr fp) return fp;
的指针类型自然是f_ptr (*)(f_ptr)
- 这也很好。
如果是这样,我觉得没有using
的f_ptr (*)(f_ptr)
应该是int (*)(int) (*[variable comes here])(int (*)(int))
,因为,当你简单地将f_ptr
替换为int (*)(int)
时,你会得到这个,因为它是用using
定义的,但是这个实际上只是导致语法错误。实际的类型是int (*(*[variable comes here])(int (*)(int)))(int)
,但我不明白它是怎么变成这样的。
看来我的理解从根本上是错误的。谁能给我一个解释或一个好的(希望不是那么深入......)资源来理解这一点?
sn-p 可能比文字更好:
int f(int i)
return i;
using f_ptr = int (*)(int);
f_ptr g(f_ptr fp)
return fp;
int main()
// This makes sense.
f_ptr (*gp0)(f_ptr) = &g;
// This is correct, although I don't get it...
int (*(*gp1)(int (*)(int)))(int) = &g;
// If you simply replace `f_ptr` by `int (*)(int)` as it's so defined with `using`,
// I feel the type should become like this, which causes syntax error.
// int (*)(int) (*gp2)(int (*)(int)) = &g;
【问题讨论】:
您的版本无法正常工作,原因与您不能将函数指针声明为int (*)(int) ptr;
相同。
旁注:第三版auto gp2 = &g;
"但这实际上只是导致语法错误。" 什么错误?请edit完整引用。结果可能是说明性的。
@mch 谢谢。我知道汽车,但我想了解 c[++] 类型的工作原理......
顺便说一句。如果你害怕嵌套函数指针类型,typedef
s 或using
s 没有错。读者将对此表示感谢。
【参考方案1】:
C++ 这样做是为了与 C 兼容
C 这样做是为了让定义镜像使用
int f(int i)
return i;
using f_ptr = int (*)(int);
f_ptr g(f_ptr fp)
return fp;
int main()
// Definition
int (*fp0)(int) = &f;
// Use
int m = (*fp0)(1);
// Definition
int (*(*gp1)(int (*)(int)))(int) = &g;
// Use
int i = (*(*gp1)(fp0))(1);
除了使用中的*
s是可选的,所以大家写
int n = fp0(1);
int j = gp1(fp0)(1);
【讨论】:
以上是关于接收和返回函数指针的函数指针类型?的主要内容,如果未能解决你的问题,请参考以下文章