如何解决如何在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 举报,一经查实,本站将立刻删除。