微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在C中动态调用嵌套函数?

如何解决如何在C中动态调用嵌套函数?

我实际上坚持问题中提到的关于动态调用嵌套函数的想法。

假设我有 4 个函数:fun1()、fun2()、fun3()、fun4()

我希望他们以这种方式被调用

Shape

我不确定如何在 C 中完成。

在 C 中有没有办法做到这一点,比如使用函数指针?

解决方法

嵌套函数不是 C 标准的一部分。一些编译器支持它们,但使用它们会使代码的可移植性降低。避免使用此类扩展。

,

如果我理解正确,您希望 fun1 调用 fun2,然后 fun2 调用 fun3,最后 fun3 调用 {{1} },但您希望能够动态指定 - 换句话说,您希望能够更改顺序,例如,fun4 调用 fun1 ,调用 fun3,调用 fun2。我假设您希望能够改变嵌套的深度。

您必须以某种方式向每个函数传达下一个函数要调用的内容。乍一看,我们可能认为最好的方法是使用回调 - 即调用 fun4 as

fun1

告诉 fun1( fun2 ); 执行 fun1,如下所示:

fun2

但是我们如何告诉 void fun1( void (*f2)( void ) ) { f2(); } 执行 fun2?我们将如何通过 fun3 传递该信息?我们可以将原型扩展为

fun1

并称之为

void fun1( void (*f2)( void (*)(void) ),void (*f3)( void ) )
{
  f2( f3 );
}

但这不是很动态 - 我们必须扩展 fun1( fun2,fun3 ); 的原型以考虑 fun1 调用 fun3。并且我们假设我们总是调用 3 个附加函数的序列。

所以,一个想法 - 我们不是传递一个指向函数的指针,而是传递一个数组的指针,以 fun4 结尾,并且每次我们调用指向的孩子,我们传递数组中下一个元素的地址:

NULL

这是一个概念验证(我使用宏来定义函数体,因为它们都做完全相同的事情,唯一的区别是名称):

void (*farr[])( void * ) = { fun2,fun3,fun4,NULL }; 

void fun1( void *f )
{
  /**
   * do fun1 stuff here
   */
  void (**flist)( void * ) = f;
  if ( flist[0] )
    flist[0]( flist + 1 ); 
}

函数参数类型是#include <stdio.h> #define FUN(N) \ void fun##N( void *f,size_t n ) \ { \ for ( size_t i = 0; i < n; i++ ) \ printf( " " ); \ puts( "in fun" #N ); \ void (**farr)( void *,size_t ) = f; \ if ( farr[0] ) \ { \ farr[0]( farr + 1,n+1 ); \ } \ for ( size_t i = 0; i < n; i++ ) \ printf( " " ); \ puts( "returning from fun" #N ); \ } FUN(1) FUN(2) FUN(3) FUN(4) int main( void ) { void (*farr[])( void *,size_t ) = { fun2,fun1,fun2,NULL }; puts( "in main" ); fun1( farr,0 ); return 0; } ,否则我们会陷入无限嵌套——void *。这是输出:

void (**)( void (**)( void (**)( ...

您可以使用不同的数据结构,例如列表,这样可以避免无限嵌套的原型,但会引入其自身的复杂性。

因此,使用该数组,您可以控制函数调用的深度和顺序。

再说一次,这只是一个想法,代码只是一个概念证明 - 我相信有更好的方法可以做到这一点,这就是我立即想到的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。