C语言 如何像汇编一样跨函数跳转
我是在单片机编程中使用,在一个子程序运行到一个位置时,无条件跳转到主函数的某一特定位置,继续运行接下来的语句,该子程序可能被嵌套了多层,如果单纯返回也不能返回到主函数。类...
我是在单片机编程中使用,在一个子程序运行到一个位置时,无条件跳转到主函数的某一特定位置,继续运行接下来的语句,该子程序可能被嵌套了多层,如果单纯返回也不能返回到主函数。类似于C语言的goto语句,但是是可以跨函数的。
我听说汇编就可以很容易无条件跳转,不知道C语言能不能也这样。谢谢~~
如果用跳转会很方便,因为有很多子程序都需要做同样的跳转动作。但是用函数返回值的方法会相当的麻烦。 展开
我听说汇编就可以很容易无条件跳转,不知道C语言能不能也这样。谢谢~~
如果用跳转会很方便,因为有很多子程序都需要做同样的跳转动作。但是用函数返回值的方法会相当的麻烦。 展开
3个回答
展开全部
额,你这个问题有点纠结
你可以想象下函数间的跳转。。。
函数的调用是一个压栈和弹栈的过程,假如以在函数间随意跳转,而不返回的话,那么就是不停的压栈,而不弹栈,而调转到另一函数的堆栈区间也将被破坏,这样就会产生一些不确定的诡异错误,我想这个你是可以想象的到的
但是你说想无条件跳转,那么函数间的跳转时不现实的,只能嵌套。
我推荐的方法是使用状态机,在单片机的while中档函数返回后判断当前状态决定下一个执行的函数。这种方法在程序设计中很常用
但是你假如是在想实现那种无条件跳转,其实也是可以的,不过需要使用C的宏来代替函数
比如有这样个函数
void set_val(int* a , int val)
{
*a = val;
}
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
set_val(&a, 1);
}
}
可以改成这样
#define set_val( a , val)\
a = val;\
goto jump;\
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
jump:
set_val(a, 1);
}
}
用宏而不适用函数这样基本可以满足你的需要,就是任意跳转,不过这种结构我十分不推荐。。。
这个程序我都没调试过,不过意思是这个意思
你可能汇编写的比较多,对C语言了解可能不多,我以前写单片机的时候也是用C写的,没啥实现不了的功能,慢慢你就习惯了哈
你可以想象下函数间的跳转。。。
函数的调用是一个压栈和弹栈的过程,假如以在函数间随意跳转,而不返回的话,那么就是不停的压栈,而不弹栈,而调转到另一函数的堆栈区间也将被破坏,这样就会产生一些不确定的诡异错误,我想这个你是可以想象的到的
但是你说想无条件跳转,那么函数间的跳转时不现实的,只能嵌套。
我推荐的方法是使用状态机,在单片机的while中档函数返回后判断当前状态决定下一个执行的函数。这种方法在程序设计中很常用
但是你假如是在想实现那种无条件跳转,其实也是可以的,不过需要使用C的宏来代替函数
比如有这样个函数
void set_val(int* a , int val)
{
*a = val;
}
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
set_val(&a, 1);
}
}
可以改成这样
#define set_val( a , val)\
a = val;\
goto jump;\
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
jump:
set_val(a, 1);
}
}
用宏而不适用函数这样基本可以满足你的需要,就是任意跳转,不过这种结构我十分不推荐。。。
这个程序我都没调试过,不过意思是这个意思
你可能汇编写的比较多,对C语言了解可能不多,我以前写单片机的时候也是用C写的,没啥实现不了的功能,慢慢你就习惯了哈
展开全部
C语言最大的特点就在于它的结构化,调用函数和返回值其实是在系统堆栈中进行压栈和出栈的过程,因此跨函数跳转是不能实现的。另外建议在C语言中应尽量避免使用goto语句。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
setjmp
longjmp
longjmp
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询