接收和返回函数指针的函数指针类型?

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) - 这也很好。

如果是这样,我觉得没有usingf_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[++] 类型的工作原理...... 顺便说一句。如果你害怕嵌套函数指针类型,typedefs 或usings 没有错。读者将对此表示感谢。 【参考方案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);

【讨论】:

以上是关于接收和返回函数指针的函数指针类型?的主要内容,如果未能解决你的问题,请参考以下文章

函数指针与数组指针与指针

函数指针和指针函数

函数指针和指针函数的区别

函数指针(函数指针作为函数形参/函数类型作为函数返回类型)

C语言返回结构体函数返回值应定义哪种类型?

C语言返回结构体函数返回值应定义哪种类型?